我有一个运行一些复杂内容的第三方脚本。
我通过 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
不会做这样的事情,只有第二个孩子会做。