busybox 쉘 프로세스와 하위 프로세스를 올바르게 중지하는 방법은 무엇입니까?

busybox 쉘 프로세스와 하위 프로세스를 올바르게 중지하는 방법은 무엇입니까?

실제 서버 프로세스는 쉘 스크립트에 의해 생성됩니다.

djb용 초기화 스크립트를 작성하려고 합니다.데몬 도구이내에엔트 소프트웨어busybox 1.24(ash shell)를 실행하는 라우터에서. daemontools가 자체적으로 시작되는 방식은 다음과 같습니다.svscanboot쉘 스크립트. 삭제하였으니 참고해주세요프로세스 제목 읽기svscanboot에서.

PATH=/opt/sbin:/opt/bin:/bin:/sbin:/usr/bin:/usr/sbin
exec </dev/null
exec >/dev/null
exec 2>/dev/null
/opt/bin/svc -dx /opt/service/* /opt/service/*/log
env - PATH=$PATH svscan /opt/service 2>&1

상위 셸 스크립트 프로세스는 svscan실제 실행 중인 서버 프로세스인 (하위) 하위 프로세스를 생성합니다.

쉘 프로세스는 TERM 신호를 수신합니다.

svscanboot &백그라운드에서 상위 프로세스를 실행 하고 종료하면 하위 프로세스가 실행됩니다.

# ps l | grep svscan
S     0  1526     1  1560   404 0:0   22:57 00:00:00 {svscanboot} /bin/sh /opt/bin/svscanboot
S     0  1528  1526   976   252 0:0   22:57 00:00:00 svscan /opt/service
# killall svscanboot

하지만 svscan은 계속 실행됩니다.

# ps l | grep svscan
S     0  1528     1   976   252 0:0   22:57 00:00:00 svscan /opt/service

상위 프로세스를 실행 svscanboot하고(포그라운드에서) 종료하면 하위 프로세스도 계속 실행됩니다.

# ps l | grep svscan
S     0   676   671  1560   400 pts1  23:41 00:00:00 {svscanboot} /bin/sh /opt/bin/svscanboot
S     0   678   676   976   252 pts1  23:41 00:00:00 svscan /opt/service
# killall svscanboot
# ps l | grep svscan
S     0   678     1   976   252 pts1  23:41 00:00:00 svscan /opt/service

killallBusybox는 플래그 -l와 ide, ong 및 show 스레드 만 포함 -q하여 매우 제한적입니다 .pswlT

Ctrl+를 사용하여 포그라운드 버전을 종료하면 C상위 프로세스와 하위 프로세스가 모두 종료됩니다.

이 경우 상위 및 하위 프로세스를 중지하는 방법은 무엇입니까 ? 를 사용 killall하고 궁극적으로 수정하는 것이 좋습니다.svscanboot

답변1

구현하다

질문과 답변을 읽어본 후"exec env 명령"의 의미한 가지 가능한 해결책은 앞에 추가하는 것입니다 env …. exec이렇게 하면 하위 프로세스가 생성되는 것을 방지할 수 있습니다. 그러나 ps출력은 {svscanboot} /bin/sh /opt/bin/svscanboot. 이름은 svscan /opt/service으로 변경됩니다 exec.

아니면 신호를 잡아

이 문제를 처리하는 또 다른 방법은 트랩을 통해 신호를 자식 프로세스에 전파하는 것입니다. 좋다Bash의 하위 프로세스로 SIGTERM 전달아니면 좀 더 자세한 설명을http://veithen.github.io/2014/11/16/sigterm-propagation.html 이 솔루션 경로의 문제점은 -9SIGKILL(신호 번호)을 캡처할 수 없다는 것입니다.

이름 변경 해결 방법 수행

KILL 신호를 잡을 수 없으므로 다음 경로로 진행하겠습니다 exec.


exec env - PATH=$PATH svscan /opt/service 2>&1

이는 이름 변경으로 인해 Entware init 시스템에서 "svscanboot"를 중지/종료/재구성하는 것과 관련된 사항을 여전히 복잡하게 만듭니다. Exec 프로세스 이름을 변경하려면 해결 방법이 필요합니다.

svscanboot 모방

svscanbootentware-daemontools-init-script는 다음 과 같이 모방으로 변경할 수 있습니다 .

ENABLED=yes
#PRECMD="exec </dev/null;exec >/dev/null;exec 2>/dev/null;/opt/bin/svc -dx /opt/service/* /opt/service/*/log"
PROCS="svscan"
ARGS="/opt/service 2>&1"
PATH=/opt/sbin:/opt/bin:/sbin:/bin:/usr/sbin:/usr/bin
PREARGS="env - PATH=$PATH"
DESC="daemontools"

주석이 달린 PRECMD는 작업이 svscan시작되는 것을 방지합니다.

관련 정보