私がこれをしたいのかどうかは事前に知りませんでした。、あるジョブが完了するのを待ってから自動的に別のジョブを開始できますか?
たとえば、tmuxセッションに行きますsudo apt update && sudo apt upgrade
。アップデート/アップグレードプロセスが完了するまで待つ必要がありますが、遅くなっているので待ちたくありません。特に進行中に待たずに他のことを行うことができるので、さらにそうです。
私はこれをうまく機能させる^Z
ことができますがbg
、私の質問は、そのタスクが完了した後にタスクを挿入することによって&& sudo apt install tree
例を挙げる方法はありますか?です。
編集:この質問はリンクされた質問と回答とは異なると思います。なぜなら、job1 && job2
^Z
fg; echo "done"
完了echo "done"
後に実行されるからですjob1
。job2
明らかに削除されます。回避策はjob1
との間にセミコロンを使用することですが、job2
これは私にとって良い解決策ではありません。
答え1
一般的に言えば、与えられたものより良い解決策はありません基本的なジョブ制御:ジョブの停止、スタックへのジョブの追加、および「fg」しかし、指摘したように、withを使用すると失敗し&&
(バックグラウンドに配置されたコマンドがゼロ以外のステータスコードで「終了」したため)、複合コマンドは常に望ましい効果を得ることはできません(現在実行中のコマンドが配置されます)。バックグラウンドですぐに次のコマンドを実行します。
この特定のユースケースには解決策があります。 Diomidis Spinellisが利用可能です。lockf.py
apt
現在のコマンドが完了するのを待つコマンドキューを作成します。
lockf /var/lib/apt/lock apt install tree
これは、予測可能な方法で外部で完了を観察できる任意のコマンドで一般化できます。
キューがソートされていないため、以下を実行すると問題が発生する可能性があります。
sudo apt update && sudo apt upgrade
インストールの実行中にキューに入れると、ロックが得られないため、最終的に実行され失敗する可能性がありapt update
ます。apt install
apt update
apt upgrade
答え2
flock(1)
Linuxのユーティリティ(またはlockf.py
他のオペレーティングシステムのスクリプト)を使用する回答、これに似ています)は、「キューにある」コマンドが送信された順序で実行されることを保証しません。
$ 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
答え3
使用する必要がありますジョブスプーラ(tsp
いいえts
)複数のapt
コマンドを実行します。
tsp apt command 1 -y
次に、オプションを使用して-d
2番目のapt
コマンドをキューリストに追加します。
tsp -d apt command 2 -y
リストを確認するためのtsp
統計です。
ts
ユーザー固有のUNIXジョブキューはデフォルトで実行されます。ユーザーはキューにコマンドを追加し、いつでもキューを監視し、ジョブの結果(実際には標準出力エラーと終了エラー)を表示できます。
-d
このコマンドは、前のコマンドが正常に完了した場合にのみ実行されます(エラーレベル= 0)。キューに追加された新しい操作は、前のコマンドの結果によって異なります。ジョブが実行されない場合、追加の依存関係は失敗したと見なされます。
答え4
常にアップデート/アップグレードする習慣を身につけたら、
( sudo apt update && sudo apt upgrade )
これにより、ジョブ制御は子プロセスを正しく一時停止して次のように入力できます。
fg ; echo "Example new command"