web-dev-qa-db-ja.com

プロセスの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

アプリケーションサーバーを停止する必要があるシェルスクリプトを作成しようとしています。サーバーを停止した後にプロセスが実行されているかどうかを確認します。プロセスがまだ実行されている場合は、kill -9を実行する必要があります。私のアプリケーションpidの。そして、シェルスクリプトでプロセスのPIDを取得して強制終了する方法がわかりません。

以下は、私が現在持っているシェルスクリプトで、アプリサーバーをシャットダウンし、プロセスがまだ実行されているかどうかを確認します。万が一実行されている場合は、プロセスの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を取得して、上記のシェルスクリプトでプロセスを-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
7
david

まず第一に; 「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."
12
arnefm

pidof gld_httpがシステムにインストールされていれば機能するはずです。

man pidofsays:

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
Timothy Martin

また、プロセスが実行されているかどうかを/proc/1234(既知のpid)で確認します。多くのアプリケーションでは、/ var/logの下にpidを保存して、名前が重複している場合に同じプロセスであることを確認します。

プログラムを呼び出した直後にスクリプトでecho $! > /var/log/gld_http.pidの出力をリダイレクトすることにより、pidを保存できます。

0
Raza