名前でシェルスクリプトプロセスを終了する

名前でシェルスクリプトプロセスを終了する

次のようにバックグラウンドで実行されるスクリプトがあります。

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 &

関連情報