次のようにバックグラウンドで実行されるスクリプトがあります。
nohup /tmp/a.sh &
kill
スクリプトが5分以上実行されたらいいです。
-bash-3.2$ nohup /tmp/a.sh &
[1] 2518
-bash-3.2$ nohup: appending output to `nohup.out'
-bash-3.2$ ps -ef | grep /tmp/a.sh
ordev 2518 17827 0 15:24 pts/3 00:00:00 /bin/sh /tmp/a.sh
ordev 2525 17827 0 15:24 pts/3 00:00:00 grep /tmp/a.sh
-bash-3.2$
-bash-3.2$ killall /tmp/a.sh # killall not working like this
/tmp/a.sh: no process killed
以下のように使用すると、killall
実行中のすべてのセッションを終了しようとします/bin/sh
。
-bash-3.2$ killall sh /tmp/a.sh
sh(17822): Operation not permitted # this pid associated with another process under root user.
/tmp/a.sh: no process killed
[1]+ Terminated nohup /tmp/a.sh .
pkill -f
必要なスクリプト名だけを削除する他の方法はありますか?
答え1
起動したプロセスのpidをファイルに保存します。新しいインスタンスを作成する前に、以前のインスタンスが完了していることを確認してください。そうでなければ殺しなさい。
echo "Starting a new A instance"
nohup /tmp/a.sh &
echo "Writing A pid to file"
echo $! > /tmp/a_pid
その後、時間を確認してスクリプトを終了できます。
if [ -f /tmp/a_pid ]; then
echo "Trying to stop previous instance of proces A"
kill $(cat /tmp/a_pid) || true
echo "Removing A pid file"
rm /tmp/a_pid
fi
答え2
人を指名して殺す必要はありません。スクリプトを実行するたびにスクリプトのPIDを保存してからスクリプトを終了する場合は、ファイルからそのPIDを呼び出すことをお勧めします。良い:
nohup /tmp/a.sh &
echo $! > a_pid
その後、終了するには、次のようにします。
ps -9 ` a_pid`
注意$!最後のコマンドが実行されると、このコマンドはnohupになります。nohup /tmp/a.sh &