nohupを使って4つのスクリプトを同時に実行したいです。これらのスクリプトはすべて同じフォルダにあります。
こんなのがうまくいくでしょうか? :
nohup /.scrip1.sh & /.scrip2.sh & /.scrip3.sh & /.scrip4.sh
nohup.outは印刷されますか?
答え1
各スクリプトの前に以下を付けますnohup
。
for script in ./script{1..4}.sh; do
nohup "$script" &
done
nohup
マニュアルによると、出力は次のようになります。追加つまりnohup.out
、すべての出力が同じファイルに書き込まれるという意味です。ただし、すべてのスクリプトが同時に実行され、ファイルに書き込まれると、出力が混在する可能性があることに注意してください。
混合出力を防ぐために、単一のファイルに書き込むことをお勧めします。
for script in ./script{1..4}.sh; do
nohup "$script" >"$script.out" 2>&1 &
done
cat ./script{1..4}.sh.out
すべてのスクリプトの実行が完了したら、すべての出力ファイルを単一のストリームにリンクできます。コマンドが返されると、すべてのバックグラウンドジョブの実行が完了したことになりますwait
(タスクがまだシェルセッションに関連付けられていると仮定します).
これの変形:
nohup sh -c 'for script do "$script" >"$script.out" 2>&1 & done' sh ./script{1..4}.sh
ここで唯一の違いは、実行するパラメータのいくつかが与えられると、ループを実行するnohup
インラインスクリプトに適用されることです。sh -c
出力はまだ.out
以前のようにファイルに書き込まれます。
sh -c
これは、スクリプトがHUPシグナルを無視し、nohup
各スクリプトを実行するシェルもシグナルを無視するために機能します(「HUPシグナルを無視する」が継承されます)。
答え2
同じタスクで4つのスクリプトを実行するための追加のスクリプトを作成できます。
$ cat all.sh
bash scrip1.sh &
bash scrip2.sh &
bash scrip3.sh &
bash scrip4.sh &
$ cat scrip1.sh
echo hello1
走るnohup bash all.sh
$ cat nohup.out
hello1
hello2
hello3
hello4
答え3
nohup
1つのプログラムしか実行できません。 nohupで複数のプログラムを実行するには、次のものを使用できますsh -c
。
nohup sh -c "/.scrip1.sh & /.scrip2.sh & /.scrip3.sh & /.scrip4.sh"
説明したようにこの回答
以下は、HUP信号からスクリプトを保護しません。
単一のnohupインスタンスで複数のプログラムを実行するには、echo $()
次のようにサブシェルを実行するechoでスクリプトを実行する必要があります。
nohup echo $(/.scrip1.sh & /.scrip2.sh & /.scrip3.sh & /.scrip4.sh)
ただし、スクリプトの出力はリンクされているため、出力を作成するときにこの点を考慮してください。
編集する:タイプ
EDIT2:私の答えが間違った理由を追加しました。
EDIT3: より良い回答を追加しました。