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를 사용하고 있거나 설치 권한이 있다고 가정합니다.
마이클 햄튼

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

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

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

3

당신은 그것을 추가 할 수 /etc/inittabrespawn:

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.