複雑なタスクを実行するサードパーティのスクリプトがあります。
SSHセッションを介してすべてを実行します(マシンはUbuntu 20.04を実行するヘッドレスVMです)。
インタラクティブに実行するとうまく動作します。
$ ./third-party-script.sh one
<script output one>
$ ./third-party-script.sh two
<script output two>
別のスクリプトで実行すると、サードパーティのスクリプトが実行されると親スクリプトが停止します。第二時間。
$ cat my-script.sh
#!/bin/sh
./third-party-script.sh one
./third-party-script.sh two
$
$ ./my-script.sh
<script output one>
[1]+ Stopped ./my-script.sh
$
私のスクリプトを前景に送ることができ、通常どおり続行します。
$ fg
<script output two>
$
この動作の原因は何ですか?これを防ぐ方法は何ですか?サードパーティのスクリプトやそのスクリプトが実行するものは修正できず、私のスクリプトのみを修正できます。 (もともと「my-script」はPythonで書かれて使用されていたので、os.system
この質問のための単純なシェルスクリプトに縮小しました)。
スクリプトを実行してみnohup
ましたが役に立ちませんでした。
@ilkkachuのおかげで実行範囲を狭めましたbash -ic some_command
。これを再現するための最小限のスクリプトです。私のもの環境は次のとおりです。
#!/bin/sh
bash -ic ls
bash -ic ls
sh -ic
そしてbash -c
すべて問題を解決しました。残念ながら、コマンドを変更することはできません。しなければならない包むどういうわけかサードパーティのスクリプトはこれを停止します。
試してみましたbash -icx
が、もう問題は絞り込まれませんでした。 2番目のbash
実行は、コマンドを印刷する前に停止します。
私はstrace -f
すべてを試してみましたが、これは最終結果です。
[pid 3805453] ioctl(255, TIOCGPGRP, [3805322]) = 0
[pid 3805453] rt_sigaction(SIGTTIN, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f131f36a090}, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f131f36a090}, 8) = 0
[pid 3805453] kill(0, SIGTTIN) = 0
[pid 3805321] <... wait4 resumed>0x7ffcc2d45bfc, 0, NULL) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
[pid 3805453] --- SIGTTIN {si_signo=SIGTTIN, si_code=SI_USER, si_pid=3805453, si_uid=4437} ---
[pid 3805321] --- SIGTTIN {si_signo=SIGTTIN, si_code=SI_USER, si_pid=3805453, si_uid=4437} ---
[pid 3805453] --- stopped by SIGTTIN ---
[pid 3805321] --- stopped by SIGTTIN ---
3805453はい第二子bashが実行中であり、-ic ls
3805321は最上位bash runningですmy-script.sh
。
kill(0, SIGTTIN)
これはstraceログの唯一の行です。最初の子供はbash
そのようなことをせず、2番目の子供だけがそうするでしょう。