"while true" 루프가 있는 스크립트가 있습니다. 매분마다 cron에서 스크립트를 실행하여 프로세스가 종료되거나 실패하면 cron이 스크립트를 다시 실행하도록 하고 싶습니다.
그런데 확인해 보니 ps -aef --forest
내 프로세스가 /usr/sbin/CROND -n
.cron이나 시스템에 좋지 않습니까? 아니면 뭔가 다른 일을 해야 할까요?
답변1
어쩌면 간단한 서비스 예가 systemd
도움이 될 것입니다.
다음은 무한 스크립트, 위치 /path/to/infinite_script
, 실행 가능 비트 세트입니다.
#!/bin/bash
while ((1)) ; do
date >> /tmp/infinite_date
sleep 2
done
아니요, 서비스 파일을 정의해야 합니다.
[Unit]
#just what it does
Description= infinite date service
[Service]
#not run by root, but by me
User=fiximan
#we assume the full service as active one the script was started
Type=simple
#where to find the executable
ExecStart=/path/to/infinite_script
#what you want: make sure it always is running
Restart=always
[Install]
#which service wants this to run - default.target is just it is loaded by default
WantedBy=default.target
그리고 넣어/etc/systemd/system/infinite_script.service
이제 서비스를 로드하고 시작합니다(루트로).
systemctl enable infinite_script.service
systemctl start infinite_script.service
현재 서비스가 실행 중이며 상태를 확인할 수 있습니다.
systemctl status infinite_script.service
● infinite_script.service - infinite date service
Loaded: loaded (/etc/systemd/system/infinite_script.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-05-28 14:18:52 CEST; 1min 33s ago
Main PID: 7349 (infinite_script)
Tasks: 2 (limit: 4915)
Memory: 1.5M
CGroup: /system.slice/infinite_script.service
├─7349 /bin/bash /path/to/infinite_script
└─7457 sleep 2
Mai 28 14:18:52 <host> systemd[1]: Started infinite date service.
이제 스크립트( kill 7349
-mainPID)를 종료하고 상태를 다시 확인하면 다음과 같습니다.
● infinite_script.service - infinite date service
Loaded: loaded (/etc/systemd/system/infinite_script.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-05-28 14:22:21 CEST; 12s ago
Main PID: 7583 (infinite_script)
Tasks: 2 (limit: 4915)
Memory: 1.5M
CGroup: /system.slice/infinite_script.service
├─7583 /bin/bash /path/to/infinite_script
└─7606 sleep 2
Mai 28 14:22:21 <host> systemd[1]: Started infinite date service.
따라서 새 PID로 어떻게 즉시 다시 시작되는지 확인하세요.
그리고 출력의 파일 소유권을 확인하십시오.
ls /tmp/infinite/date
-rw-r--r-- 1 fiximan fiximan 300 Mai 28 14:31 infinite_date
따라서 스크립트는 서비스 파일에 설정된 올바른 사용자에 의해 실행됩니다.
물론 서비스를 중지하거나 비활성화할 수 있습니다.
systemctl stop infinite_script.service
systemctl disable infinite_script.service
편집하다:
자세한 내용: 사용자의 개인 서비스는 (기본적으로) $HOME/.config/systemd/user/
그에 따라 배치되고 관리 될 수 있습니다 systemctl --user <commands>
. 개인용 crontab과 마찬가지로 루트가 필요하지 않습니다.
답변2
뮤.
cron은 작업에 적합한 도구가 아닙니다.
올바른 도구는서비스 매니저, 서비스가 종료되면 자동으로 다시 시작하는 아이디어도 담았습니다. (모든 사람이 이렇게 하는 것은 아닙니다.) 이러한 서비스 관리자에는 다음이 포함됩니다.
- 댄 번스타인의데몬 도구
- 아담 샘슨의함대
- 브루스 건터의daemontools-앙코르
- 로랑 베르코s6
- 게릿 펩의달리다
- 웨인 마샬의범인
- 출시됨(MacOS에만 해당)
- systemd(Linux에만 해당)
- fscd(FreeBSD에만 해당)
- 감독자
- 내 거간식
서비스 관리자에 적합한 서비스 정의를 생성하고 무한 루프 스크립트를 실행한 후 추가합니다. 일부 서비스 관리자의 경우 이는 run
무한 루프 스크립트를 실행하는 작은 프로그램(종종 스크립트 자체)일 뿐입니다. 서비스 관리자는 시작, 모니터링 및 자동 재시작을 담당합니다.
여러 서비스 관리자를 사용자별 서비스 관리 및 시스템 전체 서비스 관리에 쉽게 사용할 수 있으며 서비스의 사용자별 서비스 정의를 자신의 계정으로 실행하도록 설정할 수 있으며 슈퍼유저 없이도 실행할 수 있습니다. 관리 권한 부여(필수) 시스템 전체 서비스를 관리하기 위해).
추가 읽기
- 조슈아 팀버먼(2012-12-29).프로세스 감독: 해결된 문제.
- 래리 두리틀(2005-06-23).유닉스 데몬 기본.
- 조나단 데보인 폴라드(2015).데몬 도구 계열. 자주 주어지는 답변입니다.
- 프로세스가 항상 실행되고 있는지 확인하십시오.
- Linux/CentOS에서 프로세스가 종료되면 자동으로 다시 시작하는 방법
답변3
@felixjn
경고: selinux를 켜면 스크립트가 실행되지 않을 수 있습니다. 나는 그것을 작동시키기 위해
/usr/local/bin
(selinux 지원 폴더입니다) 로 이동하세요 .해당 편집
/etc/systemd/system/infinite_script.service
수정을 수행합니다.ExecStart
sudo restorecon -rv /usr/local/bin
이 정보를 selinux로 가져오려면 실행하세요 .systemctl daemon-reload
드디어 달려갔다서비스 다시 시작
systemctl start infinite_script.service