init.d에 의해 살아있는 프로세스를 시작하는 표준 또는 최선의 방법


14

init.d쉘 스크립트 로 데몬을 계속 시작하는 표준 방법이나 모범 사례를 찾고 있습니다.

또는 더 나은 방법으로 직접 살아남을 수있는 방법이 /etc/init.d있습니까?

특히, 예기치 않은 종료 프로세스를 찾는 dtnd with 및 무한 루프라는 데몬이 있습니다. 데몬이 있으면 다시 깨 웁니다. 또한 주어진 시스템 사용자가 세차를 실행하도록 start-stop-daemon 도구를 사용합니다.

시작시이 dtnd 데몬을 실행하고 싶습니다. 이 동작을 달성하기 위해 start, stop 및 status 명령을 사용하여 dtnd 파일을 "랩핑"하는 init.d 스크립트를 작성했습니다.

해결하고 싶은 두 가지 질문이 있습니다.

  1. init.d 셸 스크립트 에서 일부 프로세스를 유지 하는 방법이 있습니까? 표준 / 가장 좋은 방법입니까?

  2. 무한 루프로 프로세스를 유지하는 것이 좋습니다? 나는 그것을 respawn달성하는 것과 같은 명령을 사용하는 것이 낫다고 생각합니다 . 맞습니까?

나는 respawn명령 의 존재에 대해 알고 있습니다. 그게 제가 필요하지만 사이의 흐름을 이해하지 못하고 있다고 생각 /etc/init.d/하고 /etc/init. 누구든지 나를 도울 수 있습니까?

참고 나는 (I 만 사용할 수있어 어느 신출내기을 inittab을하지 않아도 /etc/init, /etc/init.d, cron로 및 시스템 도구 start-stop-daemon. 나는 단지 기본 도구를 의미)

시간 내 주셔서 감사합니다!


답변:


13

데비안은 결국 시스템을 만들었으므로 systemd를 사용하는 Linux 시스템에서 시스템을 수행하는 방법입니다.

Systemd는 서비스를 자동으로 유지하는 것을 처리 할 수 ​​있습니다. 다른 도구는 필요하지 않습니다. Restart=always서비스 파일 [Service]섹션에 설정되어 있는지 확인하십시오 .

# vi /etc/systemd/system/dtnd.service

[Service]
Restart=always
#...everything else...

보다 복잡한 시나리오를 위해 몇 가지 다른 옵션 도 사용할 수 있습니다.


2
미래에는보다 유연한 옵션이 표시되지만 현재 환경 / 조건을 처리합니까? 툴을 설치하는 것은 지게차 분배 변경 / 업그레이드에 비해 가장 저항이 적은 경로 인 것 같습니다.
— ewwhite

@ewwhite 그것은 달려있다. 데비안은 wheezy 이후 시스템을 구성했지만 기본 초기화는 아니 었습니다. jessie의 기본값이어야합니다. 그리고 우리 사용자가 대답을 수락했기 때문에 다른 이유로 이미 systemd를 사용하고 있거나 설치 권한이 있다고 가정합니다.
— 마이클 햄튼

systemd는 init.d스크립트를 삭제 & 기반으로 보인다*.service
— yurenchen

2
대신 직접 안전한 사용을 편집 systemctl edit myservice한 다음 systemctl daemon-reload다시 시작을 MYSERVICE.
— Pablo A

@PabloBianchi 기존 서비스 단위를 재정의하는 경우 재정의를 만드는 것이 좋습니다. OP와 마찬가지로 처음부터 단위를 만들면 의미가 없습니다.
— Michael Hampton

3

당신은 그것을 추가 할 수 /etc/inittab와 respawn:

d1:2345:respawn:/path/to/your/first_daemon arg1 arg2
d2:2345:respawn:/path/to/your/second_daemon arg1 arg2

더러운 해킹이지만 과거에는 이전 sysv-init 시스템에서 성공적으로 사용했습니다.


그러나 데몬은 일반적으로 setsid () 및 fork ()를 백그라운드에서 실행하지 않습니까?
— symcbean

감사합니다! 당신이 말했듯이 그것은 더러운 핵이지만 작동합니다. 어쨌든 나는 systemd의 사용법을 선호합니다. 이제 나는 그것이 존재한다는 것을 안다.
— Adrian Antunez

RHEL6에서는 작동하지 않습니다. 부활 유틸리티를 사용할 수없는 것 같습니다.
— Djidiouf

2

이것이 데비안이 체계화 된 이유 중 하나입니다.

서비스가 다운되었거나 응답하지 않으면 sysvinit (/etc/init.d)가 감지 할 수 없습니다. 즉, 서비스를 더 이상 수행하지 않을 경우 이러한 서비스를 모니터링하고 에스컬레이션해야합니다.

아마도 가장 쉬운 방법은 systemd (RHEL7의 기본값, 다음 데비안 및 우분투 시스템에서 기본값이 됨), upstart (RHEL6, Ubuntu 12.04 및 14.04의 기본값), daemontools (예 : 언급 한 것과 같이)와 같은 다른 데몬 핸들러로 마이그레이션하는 것입니다 djb) 또는 다른 것.

서비스를 유지하는 일을하는 것은 sysvinit의 PITA 일 것입니다.


1

가장 좋은 방법은 데몬이 처음에 멈추지 않도록하는 것입니다.

DJB의 daemontools를 보고 싶지 않을 수도 있습니다.


3
물론 가장 좋은 방법은 데몬이 멈추지 않도록하는 것입니다. 그러나 apache2, mysql, samba, pulseaudio와 같은 if-I-stop-wake-me 접근법을 따르는 많은 응용 프로그램이 있습니다 ... 나는 daemontools를 찾고 있었고 좋은 접근법처럼 보입니다. 불행히도 외부 도구를 설치할 수 없습니다. bash 스크립팅 또는 start-stop-daemon 및 init.d 구성을 사용하여 수행해야합니다.
— Adrian Antunez

1

나를위한 표준 접근법은 Monit 유틸리티 를 사용하는 것 입니다.

Monit과 같은 것을 작성하고 실행 중이거나 생성 한 데몬을 감시 할 무언가가 필요한 경우 설명에서 알 수 없습니다.


1
안녕 ewwhite, 내 응용 프로그램이 실행되고 있는지 확인해야합니다. 불행히도 외부 도구를 설치할 수 없습니다. bash 스크립팅 또는 start-stop-daemon 및 init.d 구성을 사용하여 수행해야합니다.
— Adrian Antunez

2
@ AdriánAntúnez 작업을 수행하는 데 필요한 도구를 설치할 수없는 경우 가능한 빨리 해당 문제를 해결해야합니다.
— 마이클 햄튼

@ AdriánAntúnez "standard"을 요청했습니다. Monit은 꽤 잘 알려져 있습니다. 당신은 "최고"를 요구했습니다 ... 당신의 제약은 정치적입니다. 소프트웨어를 설치할 수없는 이유 는 무엇 입니까?
— ewwhite

1
원하는 작업을 수행하는 경우 불필요한 도구 또는 종속성이 아닙니다 .
— ewwhite

1
@ewwhite 죄송합니다. 외부 도구에 의존하지 않는 것이 좋습니다.
— Adrian Antunez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.