쉘 스크립트를 데몬으로 실행하는 "올바른" 방법

쉘 스크립트를 데몬으로 실행하는 "올바른" 방법

나는 글을 쓰고있다쉘 스크립트시작 시 데몬으로 실행하고 싶습니다.외부 도구는 사용되지 않습니다.데몬 도구또는악마.


리눅스 데몬 작성 HOWTO

~에 따르면리눅스 데몬 작성 HOWTO,ㅏ적절한데몬 프로세스에는 다음과 같은 특징이 있습니다.

  • 포크상위 프로세스에서
  • 폐쇄모두파일 설명자(즉, stdin, stdout, stderr)
  • 열려 있는통나무쓰기용(구성된 경우)
  • 변경됨작업 목록지속적인 (보통 /)
  • 초기화파일 모드 마스크(마스크)
  • 독특한 만들기세션 ID(보안 식별 번호)

악마소개하다

이것악마소개하다한 단계 더 나아가서 일반적인 데몬은 다음과 같은 점을 지적합니다.

  • 그것과 관계를 끊다제어 터미널(있는 경우) 모두 무시합니다.터미널 신호
  • 그것과 관계를 끊다프로세스 그룹
  • 핸들SIGCLD

일반적인 Linux 도구만 사용하여 sh이나 스크립트에서 dash이 모든 작업을 어떻게 수행 할 수 있습니까?bash

스크립트는 추가 소프트웨어 없이도 가능한 많은 배포판에서 실행될 수 있어야 합니다.더반우리의 주요 초점입니다.


노트:온라인에 많은 답변이 있다는 것을 알고 있습니다.스택 교환nohup네트워크에서는 또는 사용을 권장 setsid하지만 이러한 방법 중 어느 것도 위의 요구 사항을 모두 충족할 수 없습니다.


편집하다:이것Daemon(7) 맨페이지SysV이전 스타일 데몬 과 새 스타일 systemd데몬 사이에 약간의 차이가 있는 것처럼 보이지만 일부 지침도 제공됩니다 . 다양한 배포판과의 호환성이 중요하므로 답변에서 차이점을 명확히 설명해야 합니다.


답변1

사용체계간단한 유닛을 생성하여 스크립트를 데몬으로 실행할 수 있어야 합니다. 여러가지가 있다옵션추가할 수 있지만 이는 매우 간단합니다.

스크립트가 있다고 가정해 보겠습니다 /usr/bin/mydaemon.

#!/bin/sh

while true; do
  date;
  sleep 60;
done

잊지 마요 sudo chmod +x /usr/bin/mydaemon.

단위를 만듭니다 /etc/systemd/system/mydaemon.service.

[Unit]
Description=My daemon

[Service]
ExecStart=/usr/bin/mydaemon
Restart=on-failure

[Install]
WantedBy=multi-user.target 

데몬 프로세스 실행 시작

systemctl start mydaemon.service 

부팅 시 시작하려면 활성화하세요.

systemctl enable mydaemon.service

만약에systemd 기반 시스템(오늘날 대부분의 Linux 배포판의 경우처럼)에서는 이는 실제로 외부 도구가 아닙니다. 단점은 모든 곳에서 작동하지 않는다는 것입니다.

답변2

아마도 여기에 뭔가가 빠졌을 것입니다. 왜 맞지 않을까요 nohup? 물론 충분하지 않다홀로, 그러나 보충하는 것은 간단 해 보입니다.

#!/bin/bash

if [ "$1" = "DAEMON" ]; then
    # is this necessary? Add other signals at will (TTIN TTOU INT STOP TSTP)
    trap '' INT
    cd /tmp
    shift
    ### daemonized section ######
    for i in $( seq 1 10 ); do
        date
        sleep 5
    done
    #### end of daemonized section ####
    exit 0
fi

export PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin
umask 022
# You can add nice and ionice before nohup but they might not be installed
nohup setsid $0 DAEMON $* 2>/var/log/mydaemon.err >/var/log/mydaemon.log &

내가 아는 한:

  • 출력이 적절하게 리디렉션됩니다(필요한 경우 /dev/null 사용).
  • umask는 상속됩니다
  • stdin어쨌든 상위 스크립트가 끝나면 죽습니다.
  • daemon.sh 스크립트의 상위는 init(또는 systemd) 로 재설정됩니다.

나는 분명한 것을 놓치고 있다는 강한 느낌을 받았습니다. 반대표를 받았지만 그것이 무엇인지 알려주세요 :-)

답변3

대부분의 배포판에는 셸 스크립트를 방어할 수 있는 Linux screen명령이 포함되어 있습니다. 나는 그것을 자주 사용합니다. 다음은 분할 화면 세션을 시작, 나열 및 종료하는 간단한 예입니다...

# screen -dmS Session_Name  bash -c "while true; do date; sleep 60; done"

# screen -ls
There are screens on:
        8534.Session_Name       (04/04/2018 08:46:27 PM)        (Detached)

# screen -S Session_Name -X quit

관련 정보