脚本导致父脚本停止

脚本导致父脚本停止

我有一个运行一些复杂内容的第三方脚本。

我通过 ssh 会话运行所有内容(该机器是运行 Ubuntu 20.04 的无头虚拟机)。

当我交互运行它时,它运行正常。

$ ./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,我将其简化为这个问题的简单shell脚本)。

我尝试运行脚本,nohup但没有帮助。

感谢@ilkkachu,我已将范围缩小到执行bash -ic some_command.所以重现这个的最小脚本我的环境是:

#!/bin/sh
bash -ic ls
bash -ic ls

sh -ic并且bash -c都解决了问题。不幸的是我无法更改命令。我需要第三方脚本以某种方式停止执行此操作。

我尝试了bash -icx,但这并没有进一步缩小问题范围。第二次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 正在运行my-script.sh

kill(0, SIGTTIN)这是strace 日志中唯一的一行。第一个孩子bash不会做这样的事情,只有第二个孩子会做。

相关内容