실행 파일을 서비스로 실행하는 방법은 무엇입니까?

실행 파일을 서비스로 실행하는 방법은 무엇입니까?

Ubuntu 18.04에서는 다음을 통해 일부 서비스를 시작하거나 중지할 수 있습니다.

sudo service cron start/stop

몇 가지 서비스를 나열할 수 있습니다.

service --status-all

출력은 아래 파일과 일치합니다 /etc/init.d/.

서비스를 관리하는 방법에는 system V init, systemd, upstart 등 여러 가지가 있다고 들었습니다. 어떤 방법을 사용해야 합니까? man serviceSystem V init임을 보여줍니다. 그런데 Linux에서는 init 대신 systemd를 사용한다고 들었습니다. Ubuntu에서 init 대신 systemd를 사용해야 합니까?

임의의 실행 파일(ELF 또는 쉘 스크립트)을 서비스로 만드는 방법은 무엇입니까?

실행 파일을 명시적으로 보호해야 합니까 setsid?https://stackoverflow.com/a/19235243/156458?

다음 게시물이 나에게 적용됩니까?

감사해요.

답변1

우분투 18.04에서 […]

서비스를 관리하는 방법에는 system V init, systemd, upstart 등 여러 가지가 있다고 들었습니다. 어떤 방법을 사용해야 합니까?

Ubuntu 18.04와 함께 제공되는 init인 systemd를 사용하고 있습니다. (Ubuntu 16.04, Fedora, openSUSE, Arch Linux, RHEL 7, CentOS 7, CoreOS에도 있으며 이는 Debian 9의 기본값입니다.)

systemd가 실행 중인지 확인하는 좋은 방법은 명령을 실행하는 것입니다 systemctl. 사용 가능하고 실행 시 출력을 생성하는 경우 systemd를 실행하고 있는 것입니다.

Ubuntu 18.04에서는 다음을 통해 일부 서비스를 시작하거나 중지할 수 있습니다.

sudo service cron start/stop

몇 가지 서비스를 나열할 수 있습니다.

service --status-all

일부 service시스템 배포판은 주로 이전 버전과의 호환성을 위해 명령과 함께 제공됩니다. systemctl서비스를 관리하려면 다음 방법을 시도해야 합니다 .

예를 들어:

$ sudo systemctl start cron
$ sudo systemctl stop cron
$ systemctl status cron

간단한 조작으로 모든 장치의 상태를 확인할 수 있습니다

$ systemctl

출력은 아래 파일과 일치합니다 /etc/init.d/.

systemd 기본 단위가 및 systemctl에 저장되어 있으므로 반드시 그런 것은 아닙니다 ./etc/systemd/system//usr/lib/systemd/system/

systemd에는 이전 SysV init 스크립트와의 호환성이 포함되어 있습니다.systemd-sysv-생성기, init 스크립트에서 명령을 호출하는 systemd 기본 서비스 단위를 생성하므로 그 아래에 init 스크립트가 있으면 /etc/init.d/systemd에도 존재할 가능성이 높습니다.

Ubuntu에서 init 대신 systemd를 사용해야 합니까?

질문이 명확하지 않습니다.

이 용어는 init일반적으로 시스템이 시작될 때 실행되는 첫 번째 프로세스(PID 1로 실행됨)를 나타냅니다. systemd는 PID 1로 실행되므로 정의에 따라 systemd초기화(즉, 시작되기 전, SysV 초기화)

"SysV init 대신 systemd를 사용해야 합니까?"라고 묻는다면,이미Ubuntu 18.04를 사용하고 있으므로 SysV init 대신 systemd를 사용하십시오. (그리고 위에서 언급했듯이 오늘날 선택하는 대부분의 배포판은 초기값으로 systemd를 선택했을 가능성이 높습니다.)

이제 "systemd를 사용해야 할까요?"라고 물으실 수 있습니다.단위바꾸다초기화 스크립트? ” 이 질문은 여기서 선택권이 있고 두 옵션 모두 작동할 수 있다고 말할 수 있기 때문에 더 관련성이 높습니다.

내 제안은 기본 작동 모드인 서비스 관리를 위해 systemd 단위를 사용해야 한다는 것입니다. init 스크립트를 생성하면 간접적인 계층이 추가될 뿐입니다(생성기가 시스템 단위를 생성하므로). 또한 올바른 데몬과 올바른 데몬에 대해 걱정할 필요가 없기 때문에 시스템 단위를 작성하는 것이 init 스크립트를 작성하는 것보다 간단합니다. 실행하기 전에 환경을 정리하십시오. 왜냐하면 systemd가 이 모든 작업을 수행하기 때문입니다.

임의의 실행 파일(ELF 또는 쉘 스크립트)을 서비스로 만드는 방법은 무엇입니까?

만들다체계화된 서비스 유닛그것을 위해.

예제는 매뉴얼 페이지를 참조하십시오. 가장 간단한 예는 서비스 단위를 생성하는 것이 얼마나 쉬운지를 보여줍니다.

[Unit]
Description=Foo

[Service]
ExecStart=/usr/sbin/foo-daemon

[Install]
WantedBy=multi-user.target

이 유닛을 아래에 저장한 /etc/systemd/system/foo.service다음 systemd를 다시 로드하여 이 유닛 파일을 읽습니다.

$ sudo systemctl daemon-reload

다음 명령을 사용하여 서비스를 시작합니다.

$ sudo systemctl start foo.service

시작 시 활성화합니다.

$ sudo systemctl enable foo.service

다음을 통해 서비스 상태를 확인할 수 있습니다.

$ systemctl status foo.service

물론 systemd는 서비스 관리를 위해 더 많은 작업을 수행할 수 있으므로 일반적인 systemd 단위는 이보다 더 길어집니다(반드시 더 복잡하지는 않지만). /usr/lib/systemd/system/*.service일반적인 사항과 예상되는 사항에 대한 더 나은 아이디어를 얻으려면 아래에서 Ubuntu와 함께 제공되는 모듈을 찾아보십시오 .

실행 파일을 명시적으로 보호해야 합니까 setsid?https://stackoverflow.com/a/19235243/156458?

아니요! 백그라운드에서 실행하지 마세요. 프로세스 그룹이나 세션 등에 대해 걱정하지 마세요. systemd가 이 모든 것을 처리합니다. 포그라운드에서 실행할 코드를 작성하면 systemd가 나머지를 처리합니다.

(백그라운드에서 실행 중인 서비스가 있는 경우 systemd할 수 있는이를 관리하는 데 사용 Type=forking하지만 포그라운드에서 실행할 때 작업이 훨씬 더 쉽기 때문에 새 서비스를 시작하는 경우 그렇게 하십시오. )

다음 게시물이 나에게 적용됩니까?

이것은 "Spring Boot" Java 프레임워크를 사용하는 애플리케이션에 관한 것입니다. Java 코드를 작성하고 프레임워크를 사용하지 않는 한 이는 관련이 없습니다. Java 코드를 작성하는 경우 포그라운드에서 서비스를 실행해 보세요.

질문은 시작에 관한 것이고 대답은 SysV 초기화 스크립트에 관한 것입니다. SysV init 스크립트를 systemd와 함께 사용할 수 있지만 위에서 설명한 대로 systemd 단위를 직접 작성하는 것이 더 좋습니다.

따라서 아니요, 그 중 어느 것도 관련이 없다고 말하고 싶습니다.

systemd 서비스 단위에 대해 더 자세히 알아보시기 바랍니다.

이 사이트는 훌륭한 리소스이기도 하므로 서비스를 위한 시스템 단위 작성을 탐색하면서 이에 대한 추가 질문을 자유롭게 게시해 주세요.

답변2

내 시스템의 기본 데몬 서비스 관리자는 무엇입니까?

존재하다최대linux init는 다른 모든 서비스와 프로세스가 생성되는 곳입니다.

기본 데몬 서비스 관리자는 를 통해 찾을 수 있습니다 man init.

관련 정보