스크립트로 인해 상위 스크립트가 중지됩니다.

스크립트로 인해 상위 스크립트가 중지됩니다.

복잡한 작업을 실행하는 타사 스크립트가 있습니다.

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>
$ 

이 동작의 원인은 무엇이며 이를 방지하는 방법은 무엇입니까? 제3자 스크립트나 그 스크립트가 실행하는 어떤 것도 고칠 수 없으며 내 스크립트만 고칠 수 있습니다. (원래 "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으나 더 이상 문제가 좁혀지지 않았습니다. 두 번째 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가 running 중이며 -ic ls3805321은 최상위 bash running입니다 my-script.sh.

kill(0, SIGTTIN)이는 strace 로그의 유일한 줄입니다. 첫째 아이는 bash그런 일을 하지 않고 둘째 아이만 그렇게 할 것이다.

관련 정보