
"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
- 기본 PID)를 종료하고 상태를 다시 확인하면 다음과 같습니다.
● 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).daemontools 제품군. 자주 주어지는 답변.
- 프로세스가 항상 실행 중인지 확인
- 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