次のようなnohupを使用してスクリプトを実行してみました。
nohup script.sh &
試したとき
ps -ef | grep "script.sh"
その文字列をパラメータとして実行されているgrepを除いて、そこには見つかりませんでした。
私はそれを正しくやっていますか?これは、プロセスが実際に実行を終了したことを意味しますか?ありがとう。
次のような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を変更する必要はありません
$!間違いなく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は、すべてデーモンに関するものです。
私は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
次に、タイムアウトを追加して、正常に実行するのに十分な時間が経過した後に自動的に強制終了する必要がありますが、それは別の質問です
その間、スクリプトでタイムアウトをテストする時間があるまで、このプロセスをベビーシッターしてクライアントの同期を実行できます
コード:
ps r
実行中のすべてのプロセスを報告します。