我有一个应用程序服务器,我们通过运行下面的命令来启动它,一旦我们运行下面的命令,它就会启动我的应用程序服务器
/opt/data/bin/test_start_stop.sh start
为了停止我的应用程序服务器,我们这样做 -
/opt/data/bin/test_start_stop.sh stop
因此,一旦我的应用程序服务器运行,如果我运行ps aux
,这就是我得到的 -
user@machineA:/home/user$ ps aux | grep gld_http
user 20426 0.0 0.0 8114 912 pts/4 S+ 13:33 0:00 grep gld_http
user 40509 0.1 0.9 3878120 1263552 ? Sl Sep22 1:53 /opt/data/bin/gld_http
现在我正在尝试制作一个shell脚本,在其中我需要停止我的应用程序服务器,然后我将检查我的进程在停止服务器后是否正在运行,如果我的进程仍在运行,那么我需要执行kill -9我的应用程序 pid。而且我不知道如何在 shell 脚本中获取进程的 pid,然后杀死它。
下面是我现在拥有的 shell 脚本,它将关闭我的应用程序服务器,然后检查我的进程是否仍在运行,如果有任何机会它仍在运行,那么我需要获取我的进程的 pid 和在那个 pid 上杀死 -9 。
#!/bin/bash
/opt/data/bin/test_start_stop.sh stop
if ps aux | grep -v "grep" | grep "gld_http"
then
echo "Server is still running"
# now get the pid of my gld_http process and invoke kill -9 on it
else
echo "Server is stopped"
fi
如何获取进程的 pid 并在上面的 shell 脚本中对其执行kill -9 操作?
更新:-
所以我的最终脚本将如下所示 -
#!/bin/bash
/opt/data/bin/test_start_stop.sh stop
if ps aux | grep -v "grep" | grep "gld_http"
then
echo "Server is still running"
# Getting the PID of the process
PID=`pgrep gld_http`
# Number of seconds to wait before using "kill -9"
WAIT_SECONDS=10
# Counter to keep count of how many seconds have passed
count=0
while kill $PID > /dev/null
do
# Wait for one second
sleep 1
# Increment the second counter
((count++))
# Has the process been killed? If so, exit the loop.
if ! ps -p $PID > /dev/null ; then
break
fi
# Have we exceeded $WAIT_SECONDS? If so, kill the process with "kill -9"
# and exit the loop
if [ $count -gt $WAIT_SECONDS ]; then
kill -9 $PID
break
fi
done
echo "Process has been killed after $count seconds."
else
echo "Server is stopped"
fi
答案1
首先; “kill -9”应该是最后的手段。
您可以使用该kill
命令向进程发送不同的信号。发送的默认信号kill
是 15(称为 SIGTERM)。进程通常会捕获此信号,进行清理,然后退出。当您发送 SIGKILL 信号 ( -9
) 时,进程别无选择,只能立即退出。这可能会导致文件损坏,并留下状态文件和打开的套接字,从而在重新启动进程时可能会导致问题。该-9
信号不能被进程忽略。
我就是这样做的:
#!/bin/bash
# Getting the PID of the process
PID=`pgrep gld_http`
# Number of seconds to wait before using "kill -9"
WAIT_SECONDS=10
# Counter to keep count of how many seconds have passed
count=0
while kill $PID > /dev/null
do
# Wait for one second
sleep 1
# Increment the second counter
((count++))
# Has the process been killed? If so, exit the loop.
if ! ps -p $PID > /dev/null ; then
break
fi
# Have we exceeded $WAIT_SECONDS? If so, kill the process with "kill -9"
# and exit the loop
if [ $count -gt $WAIT_SECONDS ]; then
kill -9 $PID
break
fi
done
echo "Process has been killed after $count seconds."
答案2
pidof gld_http
如果它安装在您的系统上,应该可以工作。
man pidof
说:
Pidof finds the process id’s (pids) of the named programs. It prints those id’s on the standard output.
编辑:
对于您的应用程序,您可以使用command substitution
:
kill -9 $(pidof gld_http)
正如@arnefm 提到的,kill -9
应该作为最后的手段。
答案3
您还可以检查/proc/1234
(已知 pid)进程是否正在运行。很多应用程序将pid保存在/var/log下以供参考,以确保它是同一个进程,以防重名。
echo $! > /var/log/gld_http.pid
您可以在调用程序后立即重定向脚本中的输出来保存 pid 。