복잡한 작업을 실행하는 타사 스크립트가 있습니다.
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 ls
3805321은 최상위 bash running입니다 my-script.sh
.
kill(0, SIGTTIN)
이는 strace 로그의 유일한 줄입니다. 첫째 아이는 bash
그런 일을 하지 않고 둘째 아이만 그렇게 할 것이다.