この下のコマンドを実行することで起動するアプリケーションサーバーがあり、下のコマンドを実行するとすぐにアプリケーションサーバーが起動します
/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
まず第一に; 「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."
pidof gld_http
がシステムにインストールされていれば機能するはずです。
man pidof
says:
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
は最後の手段として使用する必要があります。
また、プロセスが実行されているかどうかを/proc/1234
(既知のpid)で確認します。多くのアプリケーションでは、/ var/logの下にpidを保存して、名前が重複している場合に同じプロセスであることを確認します。
プログラムを呼び出した直後にスクリプトでecho $! > /var/log/gld_http.pid
の出力をリダイレクトすることにより、pidを保存できます。