25

次のようなnohupを使用してスクリプトを実行してみました。

nohup script.sh &

試したとき

ps -ef | grep "script.sh"

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

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

4

6 に答える 6

21

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

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

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

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

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

/var/run通常のユーザーとしては書き込みできない場合があります。そうでない場合は、/tmp

于 2010-05-31T14:06:27.020 に答える
19

nohupの実装に従いますが、ほとんどの場合は機能します。走った後

nohup script.sh &

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

HISPID=$!

次に、psまたはkillを使用してそこにあるかどうかを確認できます。

ps -p $HISPID
kill -0 $HISPID

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

于 2010-05-31T14:12:01.120 に答える
4

$!間違いなく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は、すべてデーモンに関するものです。

于 2010-06-01T10:24:59.200 に答える
4

私はscompt.comによる提案に従い、スクリプトを変更してpid

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

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

[1] 3428
于 2014-05-15T22:03:01.607 に答える
3

うまくいったのは

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

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

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

于 2014-07-05T18:56:35.067 に答える
1

コード:

ps r

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

于 2015-03-25T09:45:40.793 に答える