데몬으로 실행하고 싶은 C 프로그램이 있습니다. CentOS에서 데몬으로 실행되도록 어떻게 설치합니까? 어떤 사람은 그것을 사용한다고 말하고 @reboot
, 어떤 사람은 그것을 넣는다고 합니다 /etc/rc.d/rc.local
. 어느 것이 올바른 접근 방식입니까?
답변1
어느 것도 아니다. 실제 데몬처럼 올바르게 실행하려면 init 시스템을 사용하여 배치해야 합니다. (그리고 /etc/init.d
적절한 폴더 /etc/rc.X
에 적절한 런레벨 링크를 생성해야 합니다 .)
검색을 실행하거나 다음과 같은 것을 찾으십시오.https://serverfault.com/questions/204695/compressive-guide-to-init-d-scripts
답변2
xinetd
네트워크 데몬을 작성한다고 가정하면, 가장 쉬운 방법은 / 에 연결 inetd
하고 데몬을 xinetd
/ 도구에 맡기는 C 프로그램을 작성하는 것입니다 inetd
.
답변3
사용자가 항상 실행하고 싶지 않고 필요할 때만 실행하고 싶은 네트워크 서비스를 수신하기 위해 무언가를 작성하려는 경우 inetd/xinetd에서 실행하고 올바른 포트와 연결하는 것이 더 나을 것입니다. 그리고 그렇게 실행합니다.
init.d는 다양한 *NIX의 "서비스"라고도 알려져 있으며 다양한 실행 수준(예: 시작, 종료, 단일 사용자, 다중 사용자, 네트워크, 그래픽 인터페이스 없음, 그래픽 인터페이스 포함)에서 실행되도록 설계된 서비스를 실행하는 데 사용됩니다. 등.). 이러한 서비스는 액세스 여부(예: 데이터베이스 등)에 관계없이 지속적으로 실행되도록 설계되었습니다.
예를 들어, 데이터베이스는 init.d/services/systemctl을 사용하여 시작/중지되므로 다중 사용자 + 네트워크 시작 중에 데이터베이스를 시작하기 위한 스크립트가 있고 다중 사용자 중에 데이터베이스를 적절하게 종료하기 위한 해당 스크립트가 있습니다. -사용자 + 네트워크 시작. 네트워크가 종료되기 전의 종료 프로세스입니다. 이러한 스크립트는 /etc/init.d/에 배치되고 올바른 실행 수준(/etc/init.d/rc2.d = runlevel2, rc3.d = runlevel 3 등)에 심볼릭 링크됩니다. "/etc/inittab" 파일을 보면 가능한 다양한 실행 수준을 확인할 수 있습니다. *NIX 유형에 따라 "runlevel" 또는 "uptime"을 입력하여 현재 실행 수준을 확인할 수 있습니다. 데이터베이스는 네트워크나 로컬을 통해 아무도 연결되지 않은 경우에도 실행됩니다.
하지만 telnet 데몬, Finger 데몬, whois 데몬 등과 같은 작은 것이 OS 동작과 더 밀접하게 연결되어 있고 항상 메모리에 있는 것을 원하지 않고 필요할 때만 inetd에 있는 것을 원하는 경우 /xinetd. 기본적으로 inetd/xinetd는 특정 포트에서 특정 유형의 연결을 발견하면 데몬을 시작하여 메시지를 처리한 다음 별도의 포트에서 다시 시작하고 완료되면 종료되는 "수퍼서버"입니다. 이렇게 하면 사용 가능한 시스템 리소스를 기반으로 연결을 처리하기 위해 수백 또는 수천 개의 프로세스를 생성할 수 있습니다.
C 프로그램을 init 실행 수준을 사용하여 "서비스"로 실행하려면 해당 기능을 수행하는 프로그램을 작성한 다음 stop 매개변수와 stop 매개변수를 지원하는 스크립트를 작성해야 합니다. 그런 다음 스크립트를 /etc/init.d/에 배치할 수 있습니다. 그런 다음 적절한 실행 수준 디렉터리(예: rc3.d)의 스크립트를 가리키는 심볼릭 링크를 생성하고 시작 심볼릭 링크는 대문자 "S"로 시작합니다. 이는 활성 상태이고 시작 시 시작되어야 함을 의미하며 그 뒤에 다음과 같은 숫자가 붙습니다. 해당 런레벨에서 다른 것보다 먼저 실행하려면 "01", 해당 런레벨 A에서 마지막으로 실행하려면 "01" 숫자 "99"입니다. 이것이 중요한 이유는 다른 서비스(예: DNS, NFS 또는 네트워킹)에 의존하는 서비스를 사용할 수 없는 동안 해당 서비스를 시작하고 싶지 않기 때문입니다. 이러한 프로세스가 시작된 후 번호를 제공해야 할 수도 있습니다. 시스템이 스크립트 S99domything을 호출하면 "start"라는 단어를 매개변수 #1로 전달하고 스크립트 내에는 "start"가 선택될 때 프로세스를 시작하는 스위치 케이스가 있어야 합니다. 스크립트를 비활성화하고 삭제하지는 않으려면 소문자 "s"로 시작하도록 이름을 바꾸십시오(예: "s99domything").
마찬가지로, 프로세스를 순서대로 종료하려면 /etc/init.d/domything 스크립트에 대한 심볼릭 링크 앞에 "K"를 넣을 수 있습니다(예: K01domything). 이제 다른 프로세스 이후에 스크립트를 시작해야 하는 경우 해당 스크립트를 종료하려면 다른 프로세스보다 먼저 종료해야 합니다. 따라서 귀하의 스타트업이 S99domything이라면 종료는 K01domything일 가능성이 높습니다. init 프로세스가 K로 시작하는 스크립트를 찾으면 스크립트를 호출할 때 첫 번째 인수를 "stop"으로 보냅니다. 서비스를 올바르게 종료하려면 스크립트에 "중지" 사례가 있어야 합니다.
꽤 똑똑해요.
이는 /sbin/shutdown을 사용하는 것이 중요한 이유이기도 합니다. 이렇게 하면 init가 올바른 시작/종료 순서를 수행하여 모든 것이 "순서대로" 처리되어 데이터 손실이나 손상이 줄어들기 때문입니다.
몇 가지 예:
/etc/rc3.d/S25mysql is a symlink to /etc/init.d/mysql.sh
/etc/rc5.d/K01mysql is a symlink to /etc/init.d/mysql.sh
두 경우 모두 심볼릭 링크는 동일한 /etc/init.d 파일을 가리키지만 init 프로세스가 이를 시작할 때 첫 번째 문자가 "S"인지 "K"인지에 따라 "start" 또는 "start"를 전달합니다. 멈추다".
이것이 거의 모든 *NIX 특징의 미묘한 변화와 일치하는 몇 가지 사항을 설명하는 데 도움이 되기를 바랍니다.
최신 *NIX 버전에서는 systemctl/services를 사용하기 위해 inetd/xinetd가 더 이상 사용되지 않습니다. 그 자리가 있고 신뢰할 수 있고 사용하기 쉽기 때문에 안타까운 일입니다. /etc/services를 보면 수년에 걸쳐 할당된 다양한 포트를 모두 볼 수 있습니다. 포트 1024 이하는 루트 소유 프로세스에서 제공되어야 합니다.
건배!