web-dev-qa-db-ja.com

「ジョブが完了するのを待ってから、別のジョブを開始する」というコマンド?

これを実行することを事前に知らない場合、ジョブが完了するのを待って、自動的に別のジョブの実行を開始することはできますか?

たとえば、tmuxセッションにジャンプしてSudo apt update && Sudo apt upgradeを実行します。次に、新しいペインを作成して何かを開始します。現在持っていないシステムに別のパッケージが必要であることを理解するためだけです。更新/アップグレードプロセスが完了するのを待つ必要がありますが、それは途方に暮れていて、それを待つ必要はありません。特に、進行中に他のことをしている可能性があるため、それを待つ必要はありません。

ジョブを^Zおよびbg- ingすることで大丈夫ですが、私の質問は、そのジョブの完了後にジョブを挿入する方法があるので、&& Sudo apt install tree 例えば?

編集:この質問は、リンクされた質問と回答とは異なると思います。job1 && job2^Zfg; echo "done"は、echo "done"の終了後にjob1が実行されるためです:job2は明らかに破棄されます。それを回避する方法は、job1job2の間にセミコロンを使用することですが、それは私にとって素晴らしい解決策ではありません。

4
Harv

一般的に、 基本的なジョブ制御:ジョブを停止し、スタックにジョブを追加し、 `fg` で与えられるものよりも優れた解決策はありませんが、指摘するように、 &&(バックグラウンドに配置されたコマンドがゼロ以外のステータスコードで「終了」するため)、とにかく常に複合コマンドで望ましい効果が得られるとは限りません(現在実行中のコマンドはバックグラウンドに配置され、後続のコマンドすぐに実行されます)。

この特定のユースケースには解決策があります— Diomidis Spinellisの lockf.py は、現在のaptコマンドが完了するのを待つコマンドのキューを作成します。

lockf /var/lib/apt/lock apt install tree

これは、完了を予測可能な方法で外部から観察できるコマンドに一般化できます。

キューは順序付けされていないため、問題が発生する可能性があります—実行した場合

Sudo apt update && Sudo apt upgrade

apt updateは実行中です。最終的にはapt install実行時間apt updateapt upgradeロックを取得できないため失敗します。

1
Stephen Kitt

Linuxからflock(1)ユーティリティを使用する(またはlockf.py他のスクリプト answer (この点で似ています)は、「キューに入れられた」コマンドが送信された順に実行されることを保証しません。

$ sh -c 'for i in 1 2 3 4 5 6 7 8 9; do sleep .1; flock / sh -c "echo $i; sleep .3" & done; wait'
1
2
3
5
4
...

ジョブキューを作成するためのばかげた「解決策」は、次のようになります。

$ (echo > jobq; tail -f jobq | sh) &
[2] 6641
$ echo echo 1 >> jobq
1
$ echo echo 2 >> jobq
$ 2
etc
1
mosvy

複数のtspコマンドを実行するには、 task-spoolerts is apt)を使用する必要があります。

tsp apt command 1 -y

次に、-dオプションを使用して、2番目のaptコマンドをキューリストに追加します。

tsp -d apt command 2 -y

リストの統計を確認するには、tspを使用します。

man tsp

tsはデフォルトでユーザーごとのUNIXタスクキューで実行されます。ユーザーはキューにコマンドを追加し、いつでもそのキューを監視して、タスクの結果(実際には標準出力と終了エラー)を確認できます。

-d

前にコマンドが正常に終了した場合にのみコマンドを実行します(エラーレベル= 0)。エンキューされたこの新しいタスクは、前のコマンドの結果によって異なります。タスクが実行されない場合、それ以上の依存関係のために失敗と見なされます。

1
GAD3R

更新/アップグレードを常に行うという習慣に陥った場合は、

( Sudo apt update && Sudo apt upgrade )

次に、ジョブ制御はサブプロセスを正しく中断し、入力できるようにします

fg ; echo "Example new command"
0
X Tian