すでにコマンド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) &