これを実行することを事前に知らない場合、ジョブが完了するのを待って、自動的に別のジョブの実行を開始することはできますか?
たとえば、tmuxセッションにジャンプしてSudo apt update && Sudo apt upgrade
を実行します。次に、新しいペインを作成して何かを開始します。現在持っていないシステムに別のパッケージが必要であることを理解するためだけです。更新/アップグレードプロセスが完了するのを待つ必要がありますが、それは途方に暮れていて、それを待つ必要はありません。特に、進行中に他のことをしている可能性があるため、それを待つ必要はありません。
ジョブを^Z
およびbg
- ingすることで大丈夫ですが、私の質問は、そのジョブの完了後にジョブを挿入する方法があるので、&& Sudo apt install tree
例えば?
編集:この質問は、リンクされた質問と回答とは異なると思います。job1 && job2
^Z
fg; echo "done"
は、echo "done"
の終了後にjob1
が実行されるためです:job2
は明らかに破棄されます。それを回避する方法は、job1
とjob2
の間にセミコロンを使用することですが、それは私にとって素晴らしい解決策ではありません。
一般的に、 基本的なジョブ制御:ジョブを停止し、スタックにジョブを追加し、 `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 update
、apt upgrade
ロックを取得できないため失敗します。
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
複数のtsp
コマンドを実行するには、 task-spooler (ts
is apt
)を使用する必要があります。
tsp apt command 1 -y
次に、-d
オプションを使用して、2番目のapt
コマンドをキューリストに追加します。
tsp -d apt command 2 -y
リストの統計を確認するには、tsp
を使用します。
man tsp :
ts
はデフォルトでユーザーごとのUNIXタスクキューで実行されます。ユーザーはキューにコマンドを追加し、いつでもそのキューを監視して、タスクの結果(実際には標準出力と終了エラー)を確認できます。
-d
前にコマンドが正常に終了した場合にのみコマンドを実行します(エラーレベル= 0)。エンキューされたこの新しいタスクは、前のコマンドの結果によって異なります。タスクが実行されない場合、それ以上の依存関係のために失敗と見なされます。
更新/アップグレードを常に行うという習慣に陥った場合は、
( Sudo apt update && Sudo apt upgrade )
次に、ジョブ制御はサブプロセスを正しく中断し、入力できるようにします
fg ; echo "Example new command"