장치가 온라인인지 확인하고 그렇지 않은 경우 일부 작업을 수행하는 스크립트

장치가 온라인인지 확인하고 그렇지 않은 경우 일부 작업을 수행하는 스크립트

저는 rtsp ffmpeg 캡처 및 연중무휴 목적을 위한 IP 카메라 서버를 구축 중입니다. 누락된 유일한 것은 카메라 연결을 확인하는 스크립트입니다. 액세스할 수 없는 경우 새 ffmpeg 캡처 프로세스를 시작할 수 있도록 카메라의 온라인 상태를 확인하기 위해 다른 스크립트를 트리거해야 합니다.

나는 이것을 테스트하는데 많은 시간을 보냈지만 지금은 아무것도 작동하지 않습니다. 그래서 이 작업에는 세 개의 스크립트가 있습니다. 첫 번째는 카메라에 여전히 액세스할 수 있는지 확인하고, 그렇지 않은 경우 두 번째로 이동합니다.

#!/bin/sh
# record-ping_cam1.sh
# Check 24h if cam is alive, in case of error code 1 (offline) start record-waitfor_xxx.sh
#
IPCAM=192.168.xxx.xxx
ping -w 86400 -i2 $IPCAM 0>/dev/null
OFFLINE=$?
if [ $OFFLINE -eq 1 ]
then
  source /home/xxx/record-ping-waitfor_cam1.sh
fi

두 번째 항목은 다시 액세스할 수 있는지 확인해야 하며, 그렇다면 세 번째 항목으로 이동하세요.

#!/bin/sh
# record-ping-waitfor_cam1.sh
# Check if Cam is alive, if yes (exit code 0) then execute record-ping-reconnect_xxx.sh
#
# Ping with infinitive loop - as soon as reachable (exit code 0) then go on with record script
IPCAM=192.168.xxx.xxx
while true; do ping -c1 $IPCAM > /dev/null && break; done
ONLINE=$?
if [ $ONLINE -eq 0 ]
then
  source /home/xxx/record-ping-reconnect_cam1.sh
fi        

세 번째는 새로운 ffmpeg 프로세스를 시작하고 ffmpeg 및 ping PID를 파일에 씁니다(나중에 필요).

#!/bin/sh
# record-ping-reconnect_cam1.sh
# Record IPcam after any case of signal lost
#
# This will print the current date and time in a format appropriate for storage
STARTTIME=$(/bin/date +"%d.%m.%Y")-"("$(/bin/date +"%H").$(/bin/date +"%M")Uhr")"
#
## IP Camera Names ##
# Creating date stamps for each of the Cameras
CAM=Cam1_$STARTTIME
#
## Network and Local Storage Locations  ## #Trailing '/' is necessary here
RCDIR="/home/xxx/Reconnect/"
#
## Record Time per File sec ##
LENGTH="86400" # (24h)
#
## Record Settings ##
#
# wait until cam is ready to capture again
sleep 40s
# start capture this camsource
ffmpeg -v 0 -rtsp_transport tcp -i "rtsp://device:port/11" -vcodec copy -an -t $LENGTH $RCDIR$CAM1.mkv & echo $! > /home/xxx/Reconnect/PIDs/ffmpeg_cam1.pid
# start the ping routine, check the cam for connectivity
source /home/xxx/record-ping_cam1.sh & echo $! > /home/xxx/Reconnect/PIDs/ping_cam1.pid
exit

문제는... 첫 번째 스크립트는 잘 실행되지만 두 번째 스크립트에는 문제가 있다는 것입니다. 그런 다음 fping으로 다른 것을 시도했지만 운이 없었습니다. 이제 while 루프를 핑하면 완벽하게 작동합니다. 그런데 첫 번째 스크립트가 작동을 멈춥니다. 제게는 이상하게 보입니다.

서버는 Raspbian Stretch를 사용하는 RPI 3b+입니다.

답변1

알았어, 알았어! 이 경우 실패 then는 없을 것 같습니다 else. 이제 작동합니다.

# Ping in an infintive loop - as soon as reachable (exit code 0) then go on with record script
HOST=adress
ping -w 86400 -i2 $HOST 0>/dev/null
OFFLINE=$?
if [ $OFFLINE -eq 1 ]
then
  echo " " 
else
  bash /home/xxx/record-ping-waitfor_g-cam1.sh
fi

답변2

"if"에서 반환 코드를 직접 사용할 수 있다는 점을 강조하는 주석입니다.

if ping -w 10 -c2 adress &> /dev/null
then echo "Ok"
else echo "Call the sys admin"
fi

리디렉션 옵션도 참조하세요 ping.

관련 정보