シェルでは、現在のジョブの後に複数のジョブをキューに入れます。

シェルでは、現在のジョブの後に複数のジョブをキューに入れます。

存在する より早い 質問私と同じように、提案された解決策はすべてCtrl+を使用して現在のフォアグラウンドタスクを一時停止しZてから実行するfg && ...か、または新しいコマンドを入力している間実行を続けるために前のタスクfg ; ...を最初にバックグラウンドに送信することです。bg

少なくとも私にとっては、これは待機中の単一のコマンドでのみ機能します。このトリックを連続して複数回使用しようとすると、その間にあるコマンドが忘れてしまいます。

$ sleep 60 && echo test1

^Z
[1]  + 2336348 suspended  sleep 60

$ fg && echo test2
[1]  + 2336348 continued  sleep 60

^Z
[1]  + 2336348 suspended  sleep 60

$ fg && echo test3
[1]  + 2336348 continued  sleep 60

test3

Howはtest1決して印刷されないことに注意してください。 (これを受け入れることはできますが、最初のコマンドは2つで構成されており、コマンドがsleep 60完全に実行されるため、これが私が最も重要なことです)test2。これは私の2番目のコマンドであり、私はそれが実行されたことがないと思います。

私が望むのは、私が他のコマンドが実行されている間に、他のコマンドをキューに追加して、現在のコマンドの後と以前にキューに追加した他のすべてのコマンドの後/前に実行することです。コマンドの順序は最終的に重要ではありませんが、共通の状態(ファイルシステムなど)に依存するため、同時に実行することはできません(それ以外の場合は別のシェルを開いてそこで実行できます)。

ご協力ありがとうございます!

ベストアンサー1

GNU/Linux システムを使用している場合、または coreutils がインストールされている場合は、以下を使用します。群れ(1)(たぶん実行可能ファイル/コマンド自体をロックファイルとして使用できます):

% cat linger
echo -n $$; date +%s; sleep $1

% flock ./linger ./linger 8 &
[3] 5941
% 59421598557788

% flock ./linger ./linger 9 &
[4] 5945
% flock ./linger ./linger 11 &
[5] 5946
% 59471598557796
59501598557805

[3]   Done                    flock ./linger ./linger 8
[4]   Done                    flock ./linger ./linger 9
[5]   Done                    flock ./linger ./linger 11

シェルでコマンドを停止すると、ゼロ以外(失敗)状態で即座に終了したように見えるため、実行しようとしている操作は機能しません。

% sleep 10 || echo FAIL
^Z
[3]+  Stopped                 sleep 10
FAIL
% fg
sleep 10
% echo $?
0

おすすめ記事