나는 글을 쓰고있다쉘 스크립트시작 시 데몬으로 실행하고 싶습니다.외부 도구는 사용되지 않습니다.데몬 도구또는악마.
리눅스 데몬 작성 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