nohupバックグラウンドコマンドをすでに実行している場合は、新しいバックグラウンドコマンドを順次実行するにはどうすればよいですか?

nohupバックグラウンドコマンドをすでに実行している場合は、新しいバックグラウンドコマンドを順次実行するにはどうすればよいですか?

すでにコマンド1を実行しているバックグラウンドがあるとしましょう。

nohup command1 &

今 command2 をバックグラウンドに送信したいのですが、 command2 をすぐに実行したくありません。 command1が完了した後、command2が実行を開始したいと思います。

この目標をどのように達成できますか?

答え1

どのシェルを実行しているのか言っていませんでした。これが役に立ちます。並列に実行するように作成されたソフトウェアを順次使用する必要があります。多くの人にとって短い答えは不可能であるということです。しかし、試してみることができるいくつかのアイデアがあります。

最初(順序を保証しない)は、バッチコマンドを使用してジョブをバッチキューに送信することです。これはとても簡単です。

別のアプローチは、一括でコマンドを送信できるスクリプトを作成することです。

バックグラウンドで実行され、一度に自分以外の1つのバックグラウンドタスクのみを完了できるようにするスクリプトを書くことができるようです。

その中で最良のオプションはバッチコマンドです。このコマンドの目的はまさにこのコマンドです。状況についてもっと知ると、答えをよりよくカスタマイズできます。たとえば、シーケンスで次のコマンドを実行する前に、前のコマンドの結果を確認する必要がありますか?すべてのコマンドをファイルに入れてそのファイルを実行するのはどうですか?

もっと教えてください。コスタ

答え2

bashがユーザーと同じシェルで作業を開始すると仮定すると、組み込みコマンドを使用できますwait

wait: wait [id]
Wait for job completion and return exit status.

Waits for the process identified by ID, which may be a process ID or a
job specification, and reports its termination status.  If ID is not
given, waits for all currently active child processes, and the return
status is zero.  If ID is a a job specification, waits for all processes
in the job's pipeline.

だから:

sleep 60 &
wait %%; echo nextjobs; sleep 60 &

残念ながら、waitこれは待っているプロセスの親プロセスと同じシェルで呼び出す必要があります。つまり、バックグラウンドで待つことはできません。つまり、上記の例では、最初のジョブが完了するまでブロックされ、2番目のジョブがバックグラウンドに送信されます。

答え3

Unixでこのfuserコマンドを実装する場合、最も簡単な方法は次のとおりです。

while [ "$(fuser nohup.out 2>/dev/null)" ]; do sleep 2; done
command2

command1と同じディレクトリで実行する必要があります。

いくつかの説明:

runコマンドを使用すると、コマンドの標準出力とエラーを保存するためのnohupファイルが生成されます。nohup.out

私が提案したいコマンドは、nohup.outファイルがまだ開いていることを確認するためにファイルを監視することです。この場合、最初のプロセスがcommand1まだ実行中であることを意味します。この場合、whileループは2秒待ってから再試行します。command1完了すると、nohup.outファイルは使用されなくなり、ループが維持され、command2実行が許可されます。他のプロセスが後でそれを使用する場合nohup.out(たとえば、誰かが実行している場合)に注意してくださいtail -f nohup.out


編集する: オペレーティングシステムがそれを提供しない場合、fuser移植可能な方法は次のとおりです。

1:バックグラウンドプロセスのプロセスIDを識別します。nohupコマンドを実行した場合は、nohupの後に次のコマンドを入力してインポートします。

pid=$!

それ以外の場合は、次のいずれかを使用してください。

pgrep command1
ps -eo pid,comm| grep -w [c]ommand1
top

または、同様の方法を使用して、pidそれに応じて変数を設定します。

完了したら、次のコマンドを実行します。

while kill -0 $pid; do sleep 2; done
command2 

command1始める前に完了するまで待ちますcommand2

答え4

サブシェルを作成しますか?

nohup (commancd1;command2) &

関連情報