Nohupを使用してスクリプトを実行してみました。
Nohup script.sh &
私が試したとき
ps -ef | grep "script.sh"
その文字列をパラメータとして実行されているgrepを除いて、それを見つけることができませんでした。
私はそれを正しくやっていますか?これは、プロセスが実際に実行を終了したことを意味しますか?ありがとう。
シェルスクリプトの最初に、PIDをファイル(たとえば、/ var/run)に書き込みます。次に、そのPIDを検索して、プロセスが完了したかどうかを確認できます。組み込みの$$
変数を使用して、シェルスクリプトのPIDを取得できます。
PIDを記録するには、スクリプトの先頭に次のように配置します。
echo $$ > /var/run/myscript.pid
次に、まだ実行されているかどうかを確認します。
ps -p `cat /var/run/myscript.pid`
通常のユーザーとして/var/run
に書き込むことができない場合があります。そうでない場合は、/tmp
を使用してください
Nohup実装の対象となりますが、ほとんどの場合は機能します。実行した後
Nohup script.sh &
pIDを変数に格納します。 $!最後のバックグラウンドプロセスのPIDです。
HISPID=$!
次に、psまたはkillでそれが存在するかどうかを確認できます。
ps -p $HISPID
kill -0 $HISPID
投稿されている他のソリューションとは異なり、script.shを変更する必要はありません
Scompt.comがスクリプトを変更してpid
を保存するという提案に従いました
次に、pid
が出力に書き込まれていることに気づいたので、保存する必要はありません。
$ Nohup ./sync-all.production.sh > sync-all.production.log &
[1] 3428
うまくいったのは
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
次に、タイムアウトを追加して、正常に実行するのに十分な時間が経過した後に自動的に強制終了する必要がありますが、これは別の質問です
一方、スクリプトでタイムアウトをテストする時間があるまで、このプロセスをベビーシットしてクライアントの同期を実行できます
$!間違いなく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はすべてデーモンに関するものです。
コード:
ps r
実行中のすべてのプロセスを報告します。