バックグラウンドで2つのシェルスクリプトを順番に実行したいと思います。可能であればnohup
。
私から
% nohup a.sh &
これはa
バックグラウンドで実行されます。
% nohup a.sh && nohup b.sh
a
その後、実行b
(a
成功した場合)
しかし、バックグラウンドで最後の組み合わせを始めるには?
もし私がするなら
% nohup a.sh && nohup b.sh &
a
前景で実行され、プロンプトをブロックし、バックb
グラウンドで起動してプロンプトに制御を返します。
% nohup a.sh & && nohup b.sh &
エラーが発生します。zsh: parse error near '&&'
バックグラウンドで2つのプロセスを開始する方法は?
答え1
これは、sh(またはcsh)と比較したzshの既知の偏差の1つです。
shから:
A && B &
略語は次のとおりです。
(A && B) &
つまり、バックグラウンドで/非同期的におよび/またはリストを実行するサブシェルを実行します。
zshでは
A && B &
同期的に実行されA
待機し、成功するとB
バックグラウンド/非同期で実行されます。
それはマニュアルに記載されている(望むよりinfo zsh list
):
ㅏリスト
;
ゼロ個以上のサブリストで構成されるシーケンス。ここで、各サブリストは、、、または改行文字で&
終わり&|
ます&!
。リスト(...)
がまたはで複雑なコマンドとして表示される場合は、オプションでリストの最後のサブリストからこのターミネータを省略できます{...}
。サブリストがまたは改行で終わると、;
シェルは次のサブリストを実行する前にサブリストが完了するのを待ちます。&
サブリストが&|
、またはで終わる場合、&!
シェルはバックグラウンドで最後のパイプを実行し、完了するのを待ちません(バックグラウンドでサブリスト全体を実行している他のシェルとの違いに注意してください)。。バックグラウンドパイプラインはゼロ状態を返します。
(強調)。
そしてFAQから:
zsh では、式全体
cmd1 && cmd2 &
のみがcmd2
バックグラウンドで実行されます。マニュアルにはこれがバグだと言われています。{ cmd1 && cmd2 } &
回避策として使用されます。
A && B
他のシェルと同様にバックグラウンドでサブシェルを実行するには、次のようにします。
(A && B) &
またはFAQ項目で提案されているように:
{A && B} &
非同期で実行する必要がある場合は、とにかくプロセスをフォークする必要があるため、これは同じです(その間、デフォルトのシェルプロセスは残りのスクリプトを実行し続けます)。
だからここにあります:
(nohup a.sh && nohup b.sh) &
ただし、サブシェルを実行するプロセスと、そのプロセスが生成される他のプロセスがSIGHUP信号の影響を受けないようにしたい場合:
(trap '' HUP; A && B) &
< /dev/null >> nohup.out 2>&1
(nohupを近づけるためにいくつか追加することもできます)
代わりに、他のsh-likeシェルでzshと同じ動作をしたい場合:
A && { B & }
(覚えておいてくださいzsh以外のシェルでジョブ制御が有効になっていない場合、非同期実行リストのstdinは/ dev / nullにリダイレクトされます。)
1前の文書のフレーズによって、意図しない偏差がある可能性があります。2000年に変更された内容で実際の動作と一致するように修正されました。(この内容は1990年にzsh 1.0にさかのぼります)shの動作について説明します。これはFAQの結論でもあります。「説明書にはこれがバグだと言われています。」 1997年から。しかし、今は変えるには遅すぎます(しかし、一部の人はsh、csh、またはkshエミュレーションで変更する必要があると思います)。
答え2
次の2つのコマンドを組み合わせる必要があります。
nohup sh -c 'a.sh; b.sh' &
成功したシャットダウンでのみ実行するには、次のよう;
に置き換えます。&&
b.sh
a.sh