Linux에서 프로그래밍 방식으로 서비스 로드 [닫기]

Linux에서 프로그래밍 방식으로 서비스 로드 [닫기]

서비스 이름(사용자가 생성)과 해당 경로가 주어지면 C++Ubuntu의 프로그램에서 런타임에 해당 서비스를 로드하고 시작하는 방법은 무엇입니까?

Windows이를 수행하는 , , 등과 유사한 기능이 있습니까 ?CreateServiceOpenSCManagerOpenService

답변1

우선, 여기가 아닌 StackOverflow에 있어야 합니다.

Windows에서 알고 있는 서비스의 전체 개념은 Linux에는 존재하지 않습니다.

Windows에서 프로세스는 SCM(서비스 제어 관리자)이 서비스를 초기화하고 제어하는 ​​데 사용하는 콜백을 등록합니다. 이를 통해 일시 중지, 중지, 시작, 재개 등 서비스와 관련하여 SCM으로 전송된 요청을 처리할 수 있습니다.

Linux에서는 이 개념이 존재하지 않습니다. 가장 가까운 것은 데몬으로 실행되는 프로그램입니다.

모든 프로그램은 상위 프로그램(이중 분기를 통해) 또는 터미널에서 분리되도록 선택할 수 있습니다. 이것이 기본적으로 Unix의 데몬의 핵심입니다. 백그라운드 프로세스이지만 Windows와 달리 특별한 제3자가 관여하지 않습니다.

거의 다 됐어요. 이 init프로세스를 통해 프로세스가 수집되고 종료 후에는 유지되지 않습니다. 또한 일반적으로 일부 init 스크립트(이전 스타일) 또는 init 시스템(systemd, upstart 등)은 특수 구문을 사용하여 프로세스를 제어합니다. 이를 위해 대부분의 데몬에는 스크립트가 해당 파일에서 프로세스 ID(PID)를 읽을 수 있도록 파일에 저장한 다음 해당 kill프로그램을 사용하여 데몬(즉, 백그라운드 프로세스)을 제어하는 ​​신호를 보낼 수 있는 옵션이 있습니다. 예를 들어 구성을 다시 읽거나 중지합니다.

당신은 할 수 있습니다정말Michael Kerrisk의 저서 "Linux 및 UNIX 시스템 프로그래밍에 대한 확실한 가이드"를 구입하여 읽고 싶고, 개발을 다른 Unixoid 플랫폼(OSX)으로 확장할 계획이라면 APUE(Advanced Programming in Unix Environments)와 같은 고전 서적을 선택할 수도 있습니다. , BSD...).

답변2

UNIX 계열 시스템에서는 데몬 프로세스와 일반 프로세스가 동일합니다. 그들 사이에는 흐릿한 선이 있습니다. 본질적으로 이들은 작동 방식 때문이 아니라 기대하는 바 때문에 의미상 분리됩니다. 데몬은 백그라운드에서 사용자와 통신하고 이벤트가 발생하기를 기다리는 프로세스일 뿐입니다. 데몬이 사용자와 통신해야 하는 경우 소켓(unix 또는 inet), 파일 시스템의 수동 관찰, 장치 파일 등 자체적으로 통신 설정을 담당합니다. 데몬은 일반적으로 일종의 "서비스 관리자"에 의해 관리됩니다. " - systemd , upstart 또는 systemV(이것은 실제 관리가 아닙니다. 이를 종료하는 방법을 알기 위해 일부 pid 파일을 유지하고 순서대로 시작하기 위한 일부 init 스크립트를 유지합니다.) 실제로 달성하려는 목표에 따라 다릅니다.

대상 시스템의 서비스 관리자에서 균일하게 서비스를 시작하려면 선택한 시스템의 제어 명령을 호출해야 합니다(이는 배포판에 따라 다르지만 systemd가 점점 보편화되고 있습니다). 예를 들어, 전화만 하면 systemctl start sshdsshd가 시작됩니다.

실제로 일부 처리를 수행하는 백그라운드 프로세스를 원한다면 이는 전혀 데몬이 아닙니다. 간단하게 forkand 를 사용하면 exec다른 프로세스(파이프를 통해 계속 연락할 수 있음)를 만들고 종료 시 하위 프로세스를 종료할 수 있으므로 이 프로세스는 함께 종료됩니다(또는 고아로 남겨두면 더 많은 데몬이 됩니다). ).

하위 프로세스에서 이중 포크를 수행하고 세션을 설정하고 파일 설명자를 닫아 더 적합한 데몬으로 만들 수 있습니다.

그러나 실제로는 달성하려는 목표에 따라 다릅니다. 아마도 당신은 여기서 잘못된 질문을 하고 있을 것이며 Linux에서는 전혀 의미가 없는 일을 하려고 할 것입니다.

답변3

비슷한 것을 발견했습니다. exec 함수를 통해 서비스를 실행하는 간단한 감시 프로그램입니다. 당신은 그것을 찾을 수 있습니다여기.

답변4

서비스가 무엇인지 이해하기

서비스는 백그라운드에서 실행되는 프로세스입니다. 대화형이 아니며 제어 터미널이 없습니다. Linux에서는 서비스를 데몬이라고 합니다.

서비스를 수동으로 관리하는 방법

터미널을 통해

#run program that should be service, output_file stands for stdout output
./executable_path arg1 arg2 > output_file

#press CTRL-Z - stops process
#move process to the background, prints its PID
bg

#disown process or you may have started process with "nohup"
disown

이제 서비스가 있으므로 터미널을 닫아도 서비스는 계속 실행됩니다.

kill "PID print before

서비스가 종료되었습니다.

쉘 스크립트를 통해

서비스를 시작하고 해당 PID를 파일에 저장하는 스크립트입니다.

nohup ./executable args > output &
MY_PID=$!
echo $MY_PID > some_folder/service_pid

서비스를 종료하는 스크립트:

kill `cat some_folder/service_pid`
rm some_folder/service_pid

C++를 통해

스크립트를 사용하여 예제와 동일한 단계를 수행할 수 있습니다. 다음과 같이 C 함수로 감싸면 됩니다.system,fork그리고exec*. 그러나 이는 Linux(unix.stackexchange.com)가 아닌 프로그래밍과 관련된 것입니다. C++에서 검색 생성 프로세스.

시스템 서비스 관리자와 통합

훌륭한. Linux에는 많은 서비스 관리자가 있고 모든 Linux 배포판이 동일한 서비스 관리자를 사용하는 것은 아니기 때문에 이는 매우 어렵습니다. 사용자는 서비스 관리자를 변경할 수도 있으므로 동일한 배포판에서도 동일한 서비스 관리자를 사용한다는 보장은 없습니다.

가장 일반적으로 사용되는 것은갑자기 나타나다그리고체계

관련 정보