특정 프로세스의 존재를 모니터링하는 서비스를 만들고 싶습니다. 다음 쉘 스크립트를 작성했습니다.
#!/bin/sh
while :
do
w=`ps u -A | grep -P ".+Sl.+/usr/local/MySource/endpoint" -c`
sleep 10
if [ $w -lt 2 ]
then
echo 0 > /sys/class/leds/alix\:2/brightness
killall -9 /usr/local/MySource/endpoint
nohup /usr/local/MySource/endpoint &> /dev/null &
last_endpoint_m=`date`
echo $last_endpoint_m > /tmp/endpoint_msleep
echo $w >> /tmp/endpoint_msleep
else
echo 1 > /sys/class/leds/alix\:2/brightness
fi
sleep 10
done
프로세스가 존재하면 스크립트는 내 컴퓨터의 LED를 끄고 프로세스를 시작합니다. ON
프로세스가 실행되는 동안 LED가 켜져야 합니다 .
그런 다음 다음 줄을 추가하여 이 스크립트를 실행합니다 /etc/rc.local
.
nohup /usr/local/MyTools/additions/XR50_endpoint_m &> /dev/null &
실행해 보면 프로세스가 있는 ps
것을 볼 수 있습니다 .XR50_endpoint_m &
내 컴퓨터는 데비안을 실행하는 리소스가 제한된(내장형) ALIX 보드입니다.
문제는
변수가 $w
항상 0이라는 것입니다(출력 파일에서 이를 확인했습니다 /tmp/endpoint_msleep
). 스크립트를 수동으로 실행하면 프로세스가 존재하고 제대로 작동하지만( $w=2
)!
그 이유가 무엇이라고 생각하시나요? 프로세스를 모니터링하는 가장 좋은 방법은 무엇입니까?
답변1
당신이 도망갔기 때문에 실패했습니다 ps u
. 에서 man ps
:
u 사용자 중심 형식을 표시합니다.
즉, ps
현재 사용자가 소유한 프로세스만 나열됩니다. 스크립트를 수동으로 실행하면 해당 사용자가 귀하이므로 프로세스가 올바르게 나열됩니다.
(@Gilles가 매우 정확하게 지적했듯이 사용하면 -A
모든 프로세스가 인쇄되므로 해석이 잘못되었습니다. pgrep
그래도 더 좋습니다).
어쨌든 더 좋은 방법은 다음을 사용하는 것입니다 pgrep
.
pgrep, pkill - look up or signal processes based on
name and other attributes
변화
w=`ps u -A | grep -P ".+Sl.+/usr/local/MySource/endpoint" -c`
도착하다
w=`pgrep -c endpoint`