バックグラウンド同期プロセス

バックグラウンド同期プロセス

バックグラウンドで2つのプロセスを開始したいが、最初のプロセスが完了するのを待つには2番目のプロセスが必要です。どちらも非常に長いため、端末からもログアウトできる必要があります。

現在私はこれを持っています:

 nohup ./script1.sh $arg1 &    
 wait
 nohup ./script1.sh $arg2 &

ここでの問題は、待機中に端末を使用できないかログアウトできないことです。また、'1 PIDコマンドをキャプチャして待つように入力しましたが、問題は解決しません。

要約すると、script1とscript2を呼び出す基本スクリプトを起動し、端末を閉じてから5日後に開きたいと思います。この時点で script1 を最初に実行しなければならず、 script2 は完了しなければ実行を開始できません。

答え1

基本思想...

2つのスクリプトを順番に実行するには、その間にセミコロンを入れることができます。script1 args ...; script2 args ...あるいは、スクリプト内で次のように2行に入れることもできます。

#!/bin/sh
script1 args ...
script2 args ...

バックグラウンドで実行したい場合でも機能します。サブシェルに入れてサブシェルをバックグラウンドに置くだけです。(script1 args ...; script2 args ...) &または:

#!/bin/sh
(
  script1 args ...
  script2 args ...
) &

最初のスクリプトが正常に終了した場合にのみ(コードを使用)、2番目のスクリプトを実行するには0セミコロンを次のように置き換えます&&script1 args ... && script2 args ...

...nohupを使う

でもnohup走りたい一つコマンドとサブシェルは個別のコマンドではなく、シェル内でのみ機能するシェル構成です。ただし、新しいシェルを起動して両方のスクリプトを実行し、それらを1つのコマンドとして渡し、nohupすべてをバックグラウンドに配置できます。

#!/bin/sh
nohup sh -c 'script1 args ...; script2 args ...' &

変数がある場合はargs ...二重引用符を使用し、変数を正しくエスケープするために特に注意する必要があります。したがって、ここに別のアプローチがあります。

...二重フォーク付き

シェルは直系の子だけを知って興味を持っています。終了しようとすると、バックグラウンドでまだ実行中のプロセスがある場合は警告メッセージが表示され、シェルを終了するとこれらの直系の子プロセスが終了します。解決策は、バックグラウンドにサブシェルを配置することによって、独自にコマンドをバックグラウンドに配置することです。あなたのシェルはコマンドではなくサブシェルについてのみ知っています。しかし、このようなリダイレクトの魔法に頼ることはできず、nohub独自のリダイレクトを設定する必要があります。

#!/bin/sh
(
  # outer subshell, will be known to your shell
  (
    # inner subshell, "hidden" from your interactive shell
    script1 "$args" ... > ~/script1.stdout.log 2> ~/script1.stderr.log
    script2 "$args" ... > ~/script2.stdout.log 2> ~/script2.stderr.log
    # note that you can do normal quoting here
  ) &
) &

関連情報