web-dev-qa-db-ja.com

既に実行中のプロセスに追加の「シャットダウン」コマンドを追加するにはどうすればよいですか?

定期的に、&& shutdown -h nowを長期実行プロセスに追加するのを忘れています。 shutdown -h nowコマンドを追加する方法はありますか最初のコマンドが呼び出されましたか?進行中のプロセスを中断することは意図されていません。たぶん、PIDを見ることができますか?

10
brubaker

Psを繰り返し実行してすべてのプロセスをリストし、出力全体をgrepする必要はありません。 ctrl-Zでプロセスをバックグラウンドで実行します

bg %1 ; wait %1 ; shutdown -h now

他のバックグラウンドジョブを実行している場合、ctrl-zを押すと、[1]の代わりに別のjobspecが与えられます。その場合は、代わりにそれを使用してください。

11
psusi

次のようなことができます。これにより、プロセスが5秒ごとに実行されているかどうかが確認され、適切なアクションが実行されます。

while true; do
  if ps -ef | grep -q '[l]ong-running-process'; then
    sleep 5
  else
    Sudo poweroff
  fi
done

grep式の角括弧に注意してください。これは、grepリストに含まれる場合にpsプロセスが一致しないようにするためです。単一の文字を角括弧で囲むだけで十分です。

3
Scott Severance

Pidがわかっている場合、これを実行できます。

while ps -p $PID; sleep 5; done; shutdown -h now

Psからエコーなしで実行するには、次のようにします。

while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now

最後に、出力なしでバックグラウンドで実行します。

(while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now ) &

スコットのソリューションは優れたソリューションですが、これにより、既にpidを知っている場合はgrepを何度も繰り返す必要がなくなります。また、入力する方がはるかに高速です。

1
Zoke

私はいつもこれをしています。

  1. プロセスを開始します。
  2. &&コマンドを実行するのを忘れたことに気付きます。
  3. ヒット Ctrl+Z プロセスを中断して、シェルに戻ります。
  4. fg && shutdown -h nowを実行して:
    1. 中断したプロセスをフォアグラウンドして再開します。
    2. 次に、終了後、実行したいものを実行します。

または、次のような他の回答で提案されているようにポーリングできます。

while ps -p $PID ; do sleep 5 ; done ; shutdown -h now
1
Naftuli Kay

両方のプロセスを実行するシェルスクリプトを作成します。

MyShellScript.txt:

#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now

これを特定のプロセスを開始するディレクトリに保存した後、次を実行します。

chmod +x MyShellScript.txt

次に、コマンドを実行する場合は、./MyShellScript.txtと入力するだけで、両方が実行されます。

0
Chris Curry