web-dev-qa-db-ja.com

bashで既に実行中のタスクの後に実行するタスクを計画する方法は?

command1 ; command2のようなもの、つまりcommand2の後にcommand1を実行する方法を探していますが、command2がすでに実行されているときにcommand1の実行を計画したい。

command2は標準入力を消費しておらず、command1は出力時に多くのテキストを生成しないため、command1を入力してEnterで確認するだけで解決できます。入力します(入力した文字はcommand1出力とブレンドされます)。

12
czerny

一般的に私がすることは:Ctrl+Zfg && command2

  1. Ctrl+Z 一時停止してシェルにさらに入力できるようにします。
  2. 必要に応じてbg。command2を入力している間、command1をバックグラウンドで再開します。
  3. fg && command2 command1をフォアグラウンドで再開し、command1が成功した場合は後でcommand2をキューに入れます。もちろん;または|| のために &&希望する場合。
11
  1. コマンドを開始する

    command1
    
  2. を押して実行を一時停止します Ctrl+Z

  3. 次のコマンドを実行して、一時停止されたコマンドのジョブ番号を確認します(通常、コマンドが一時停止されたときにコンソールに出力されます)。

    jobs
    
  4. バックグラウンドでcommand1を続行します

    bg
    
  5. command2の終了を待つcommand1の実行を計画する

    wait -n <command1 job number> ; command2
    

ドキュメント Job Control Builtins

18
czerny

いくつかの選択肢があります。

  • アンパサンドが1つ、「バックグラウンドにプッシュ」、2番目のプログラムは最初のプログラムの開始後に開始されますが、おそらく互いに並行して実行されます。

    command1 & command2
    
  • 2つのアンパサンドを使用、 'logical and'、2番目のプログラムは、最初のプログラムが正常に終了した場合にのみ開始されます。

    command1 && command2
    
  • セミコロン付きコマンドラインでコマンドを区切ると、2番目のプログラムは、最初のプログラムが失敗または中断した場合でも、終了すると開始します。

    command1 ; command2
    
  • wait <PID>最初のコマンドが同じシェル(同じターミナルウィンドウ内)から既に実行されている場合は、最初のコマンドが完了するまで待機します。

  • それ以外の場合、最初のコマンドが別のシェルから(別のウィンドウで)すでに実行されている場合は、小さなpsを使用したwhileループを使用して、PIDがps)によってまだ検出されているかどうかを確認できます。見つからない場合は、2番目のコマンドが開始されます。

    このbashのデモ例は、topがPIDを介して実行されているかどうかを確認し、コマンドを実行します

    echo "*** $USER, I am ready now ***"
    

    if/when topが実行されていない。

    pid=$(ps -A|grep top|cut -d ' ' -f 1); \
    while [ "$pid" != "" ]; do ps -A|grep "$pid" > /dev/null; \
    if [ $? -eq 0 ]; then sleep 5;else pid=""; fi; done; \
    echo "*** $USER, I am ready now ***"
    
4
sudodus

標準的な方法は、コマンド1をバックグラウンドで開始し、コマンド2をバックグラウンドまたはフォアグラウンドで開始させることです。完全なコマンドは次のとおりです。

command1 & command2

&は、これら2つのコマンド間のコネクタではありません。 command1を単独で使用して、バックグラウンドで開始することができます。

command1 &

そして、これはバックグラウンドで両方のコマンドを開始するための正しい構文です:

command1 & command2 &
0
user147505