web-dev-qa-db-ja.com

Nohupとして実行されたスクリプトが終了したかどうかを確認する方法

Nohupを使用してスクリプトを実行してみました。

Nohup script.sh &

私が試したとき

ps -ef | grep "script.sh"

その文字列をパラメータとして実行されているgrepを除いて、それを見つけることができませんでした。

私はそれを正しくやっていますか?これは、プロセスが実際に実行を終了したことを意味しますか?ありがとう。

24
learner135

シェルスクリプトの最初に、PIDをファイル(たとえば、/ var/run)に書き込みます。次に、そのPIDを検索して、プロセスが完了したかどうかを確認できます。組み込みの$$変数を使用して、シェルスクリプトのPIDを取得できます。

PIDを記録するには、スクリプトの先頭に次のように配置します。

echo $$ > /var/run/myscript.pid

次に、まだ実行されているかどうかを確認します。

ps -p `cat /var/run/myscript.pid`

通常のユーザーとして/var/runに書き込むことができない場合があります。そうでない場合は、/tmpを使用してください

17
Edward Dale

Nohup実装の対象となりますが、ほとんどの場合は機能します。実行した後

Nohup script.sh &

pIDを変数に格納します。 $!最後のバックグラウンドプロセスのPIDです。

HISPID=$!

次に、psまたはkillでそれが存在するかどうかを確認できます。

ps -p $HISPID
kill -0 $HISPID

投稿されている他のソリューションとは異なり、script.shを変更する必要はありません

16
unbeli

Scompt.comがスクリプトを変更してpidを保存するという提案に従いました

次に、pidが出力に書き込まれていることに気づいたので、保存する必要はありません。

$ Nohup ./sync-all.production.sh > sync-all.production.log &

[1] 3428
4
decibel.places

うまくいったのは

Sudo ps -e | grep [script name or fragment of name]

たとえば、「mf-sync.js」という名前のスクリプトの場合

Sudo ps -e | grep mf-sync

スクリプト名とpidを表示します。次に、たとえばpidが1234の場合に使用できます

Sudo kill 1234

次に、タイムアウトを追加して、正常に実行するのに十分な時間が経過した後に自動的に強制終了する必要がありますが、これは別の質問です

一方、スクリプトでタイムアウトをテストする時間があるまで、このプロセスをベビーシットしてクライアントの同期を実行できます

3
decibel.places

$!間違いなくkshおよびksh93の一部です。

echo $Shell

実行しているシェルが表示されます。

&の合理的な使用例

#!/bin/ksh
Nohup ./myscript.sh argument1 2>&1> mylogfile &
# do some other task
cnt=0
while [ $cnt -le 100 ]
do
    # work on another task here
    cnt=$(( $cnt + 1 ))
done
wait

Waitステートメントは、実行中のすべての子プロセスに対して一時停止します。通常、プロセスをバックグラウンドに潜入させて、それが永久に実行されることを期待してから、完全に忘れることはありません。

永久に実行される完全に切り離されたプロセスが必要な場合は、デーモンを検討してください。一部の人々はシェルでデーモンを作成します-ベストプラクティスではありませんが、それは行われます。通常、UNIXデーモンはCで書かれています。

Stevensの第13章「UNIx環境での高度なプログラミング」2edはすべてデーモンに関するものです。

3
jim mcnamara

コード:

ps r

実行中のすべてのプロセスを報告します。

0
Helena