실제 서버 프로세스는 쉘 스크립트에 의해 생성됩니다.
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
killall
Busybox는 플래그 -l
와 ide, ong 및 show 스레드 만 포함 -q
하여 매우 제한적입니다 .ps
w
l
T
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
이 솔루션 경로의 문제점은 -9
SIGKILL(신호 번호)을 캡처할 수 없다는 것입니다.
이름 변경 해결 방법 수행
KILL 신호를 잡을 수 없으므로 다음 경로로 진행하겠습니다 exec
.
…
exec env - PATH=$PATH svscan /opt/service 2>&1
이는 이름 변경으로 인해 Entware init 시스템에서 "svscanboot"를 중지/종료/재구성하는 것과 관련된 사항을 여전히 복잡하게 만듭니다. Exec 프로세스 이름을 변경하려면 해결 방법이 필요합니다.
svscanboot 모방
svscanboot
entware-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
시작되는 것을 방지합니다.