생성된 프로세스를 다시 시작하거나 종료하는 기본 제공 명령이 없는 바이너리가 있습니다. 내장된 CentOS 서비스 중 일부를 살펴본 후 편의성 SIGHUP
등을 존중하는 서비스가 많기 때문에 템플릿으로 사용할 수 없다는 결론에 도달했습니다. 이는 실행하고 제어하기 위해 .sh 스크립트를 생성해야 한다는 것을 의미하는데, 이것이 제가 겪고 있는 문제 중 일부입니다. 단위 템플릿에는 다음과 같은 모듈이 있습니다.PID 파일하지만문서에서 어떤 정보도 찾을 수 없습니다PID
systemd가 시작되는 프로세스를 관리하고 추적하는 경우 이는 PID file
서비스가 자체적으로 생성됨을 나타내는 방법일 뿐입니다. 첫 번째 경우 바이너리 자체가 아닌 /bin/sh를 통해 실행되는 스크립트인 경우 어떻게 올바르게 추적합니까? sh process
PID를 캡처하지 않습니까 ?
HTTPD(Apache) 서비스 단위를 확인합니다.
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
${MAINPID}가 어디에도 선언되지 않은 경우 여기에서 어떻게 참조합니까?
현재 내 가정은 시작/중지/종료 재시작 작업을 처리하기 위해 .sh 스크립트에 인수를 전달해야 한다는 것입니다. 이것이 일반적으로 허용되는 관행입니까? 제한된 사용자(전혀 감히 건드릴 수 없는 페이지)로 실행한다면 SElinux에서는 어떻게 작동할까요? sh 스크립트도 지정된 제한된 사용자로 실행됩니까?
답변1
현재 내 가정은 시작/중지/종료 재시작 작업을 처리하기 위해 .sh 스크립트에 인수를 전달해야 한다는 것입니다.
이것은 일반적인 관행입니다. 이것은 일반적인 것입니다나쁜관행. 그것은 가난한 사람의 데몬이고, (언제나 그렇듯이) 쉘 스크립트로 제대로 작성되지 않았습니다. 이것은 완전히 불필요합니다. 사실, 귀하가 묻는 거의 모든 내용은 완전히 불필요합니다. "Poor Man's Dæmon Supervisors" 및 "Bad Loggers"를 사용하여 래퍼 쉘 스크립트를 작성하지 마십시오. 불안정하고 위험한 PID 파일 메커니즘을 망쳐 놓지 마십시오. Service Manager를 사용하고 있으며이 중 어느 것도 필요하지 않습니다.
Type=simple
서비스 단위를 설정합니다 . , , , , 를 systemctl
사용할 수 있으며 , 완전히 사용해도 괜찮습니다.start
stop
restart
reload
enable
disable
어리석은 래퍼 스크립트 없음. systemd와 같은 서비스 관리자기억해라처음에 포크했기 때문에 프로세스 ID입니다.
프로그램에 "데몬" 메커니즘이 있는 경우,꺼 줘그리고사용하지 마세요. daemontools 등에게 감사드립니다. 이는 오랫동안 요구 사항이었으며, 많은 프로그램이 지난 20년 이상 이러한 메커니즘을 개발해 왔지만, 다른 프로그램에서는 애초에 "데몬"을 기본값으로 설정하지 않아 기본 작동 모드에서 사용할 수 있습니다.
사용하지 마십시오 Type=forking
. 절차가 거의 없으므로 최후의 수단이 되어야 합니다.사실 합의는. 귀하의 프로그램은 확실히 그렇지 않습니다. Type=simple
표준으로 선택하세요 . 초기 소켓 열기(소켓 장치 구성 사용)를 사용하거나 Type=notify
프로그램이 이를 지원하는 경우 사용하십시오. 프로그램 작성자에게 돌아가서 LISTEN_FDS
초기 소켓 열기(프로토콜)가 지원되지 않고 소켓 연결을 수신하는 프로그램인 경우 지원하는 것이 좋습니다. 신호가 프로그램을 중지 ExecStop
하면 명시적인 명령을 사용하지 마십시오.TERM
그래야 한다. 걱정하지 마십시오 ${MAINPID}
. 유닛 파일에는 해당 내용이 없습니다.
하나님의 사랑을 위해, 초보자가 따라할 수 있는 간단하고 직접적인 서비스 예제로 Apache를 사용하지 마십시오. Apache는 WINCH
프로세스가 종료되어야 한다고 생각합니다. 볼만한 다른 것을 찾아보세요.
추가 읽기
- 조나단 드보인 폴라드(2001). Unix 데몬을 설계할 때 피해야 할 실수. 일반적인 답변.
- 조나단 데보인 폴라드(2015).실제로 데몬이 필요하지 않습니다. 진짜.. 체계화된 공포의 집.
- 조나단 데보인 폴라드(2015).Unix 데몬의 준비 프로토콜 문제. 자주 주어지는 답변입니다.