如何在shell脚本中获取进程的pid并对其调用kill -9?

如何在shell脚本中获取进程的pid并对其调用kill -9?

我有一个应用程序服务器,我们通过运行下面的命令来启动它,一旦我们运行下面的命令,它就会启动我的应用程序服务器

/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 。

相关内容