![Systemd를 사용하여 간단한 감시 장치를 만드는 방법은 무엇입니까?](https://linux55.com/image/181151/Systemd%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EA%B0%84%EB%8B%A8%ED%95%9C%20%EA%B0%90%EC%8B%9C%20%EC%9E%A5%EC%B9%98%EB%A5%BC%20%EB%A7%8C%EB%93%9C%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
특정 장기 실행 프로세스(예: 영원히)가 실행 중인지 확인하고 그렇지 않은 경우 다시 시작하는 간단한 스크립트가 있습니다(일부 세부 정보는 생략됨).
#!/bin/bash
PROC_LIST=$(ps ax | grep <stuff>)
while read cfg
do
PROC_NAME=$(echo $cam_cfg | cut -f2 -d' ')
PROC_COUNT=$(echo $PROC_LIST | tr ' ' '\n' | grep $PROC_NAME | wc -l)
if [[ $PROC_COUNT -eq 0 ]]; then
echo "Starting process for $PROC_NAME"
<process start> 2> /dev/null &
fi
done < $CONFIG
여기서의 아이디어는 관련 프로세스 목록을 가져와서 구성 파일에 지정된 키워드가 포함되어 있는지 확인하는 것입니다. 중요한 점은 필요한 경우 &를 사용하여 프로세스를 분기한다는 것입니다. 스크립트를 수동으로 실행하면 작동합니다.
저는 Systemd가 이 스크립트를 30초마다 실행하기를 원합니다. 이를 위해 다음과 같은 유닛을 만들었습니다.
제공하다:
[Unit]
Description=Check processes
[Service]
Type=oneshot
WorkingDirectory=/home/user/scripts
ExecStart=/home/user/scripts/watchdog.sh /config
User=user
[Install]
WantedBy=multi-user.target
시간제 노동자:
[Unit]
Description=Check running processes
[Timer]
OnBootSec=30s
OnActiveSec=30s
[Install]
WantedBy=timers.target
Type=oneshot을 사용할 때 모니터링되는 프로세스가 전혀 시작되지 않았으므로 30초마다 타이머가 시작되고 모든 프로세스를 다시 시작하려고 시도하는 것으로 나타났습니다. 나는 포크하기 때문에 서비스가 종료되면 모든 하위 프로세스도 종료되기 때문이라고 생각합니다.
Type=forking을 사용하면 프로세스가 필요에 따라 시작되고 지속되는 것을 볼 수 있습니다. 그러나 이 경우 타이머는 예약되지 않으므로 다시 실행되지 않습니다. 나는 이것이 포크된 서비스를 다시 활성화해야 한다는 사실을 인식하지 못하기 때문이라고 생각합니다. 그래서:
- 무슨 일이 일어나더라도 스크립트가 30초마다 실행되도록 위의 문제를 어떻게 해결할 수 있습니까?
- 이 연습을 통해 실제로 systemd와 싸우는 것처럼 느껴집니다. 더 나은 디자인이 있나요? CONFIG는 임의적이고 잠재적으로 동적 목록이므로 각 항목에 대해 시스템 서비스를 만드는 것이 약간 꺼려집니다.