スクリプトによって親スクリプトが停止します。

スクリプトによって親スクリプトが停止します。

複雑なタスクを実行するサードパーティのスクリプトがあります。

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 ls3805321は最上位bash runningですmy-script.sh

kill(0, SIGTTIN)これはstraceログの唯一の行です。最初の子供はbashそのようなことをせず、2番目の子供だけがそうするでしょう。

ベストアンサー1

おすすめ記事