使用 monit 腳本觀察腳本執行似乎忽略了管道

使用 monit 腳本觀察腳本執行似乎忽略了管道

我想讓 bash 命令在後台運行並由 monit 監視。為了取得這個進程的PID,我在網路上找到了這個腳本,並對其進行了修改以適合我的命令:(名為sdr.sh)

#!/bin/bash

NAME="sdr"
LOG_FILE="/tmp/$NAME.log"
PID_FILE="/var/run/$NAME.pid"
CMD="/usr/local/bin/rtl_fm -o 4 -A lut -s 22050 -f 254.2355M - | /usr/local/bin/multimon-ng -t raw -f alpha /dev/stdin |& /home/me/import.rb"

function startnotification {
VAR=`ps -ef | grep "$CMD" | grep -v grep | wc -l`
if [ $VAR -gt 0 ]; then
echo "$NAME already running..."
else
nohup $CMD > $LOG_FILE 2>&1 &
echo $! > $PID_FILE
echo "$NAME listener is started..."
fi
}

function stopnotification {
kill `cat /var/run/$NAME.pid`
rm -f $PID_FILE
echo "$NAME listener stopped."
}
case $1 in
start) startnotification;;
stop)  stopnotification;;
restart)
stopnotification
startnotification;;
*)
echo "usage: $NAME {start|stop}" ;;
esac
exit 0

當我執行命令時

/usr/local/bin/rtl_fm -o 4 -A lut -s 22050 -f 254.2355M - | /usr/local/bin/multimon-ng -t raw -a POCSAG1200 -f alpha /dev/stdin |& /home/me/import.rb

在我的 bash cmd 中它工作正常。但是當我執行 a 時,sdr.sh start出現以下錯誤:

/usr/local/bin/rtl_fm: invalid option -- 'a'

正如您所看到的,-a是 的參數multimon-ng,而不是 的參數rtl_fm。看來,這個管道沒有被解釋為管道。

答案1

我懷疑ps ... grep您的函數中的該行返回了一些附加資訊startnotification()。為了進一步調試,我將首先打開一些調試來運行腳本。

function startnotification {
set -x
VAR=`ps -ef | grep "$CMD" | grep -v grep | wc -l`
if [ $VAR -gt 0 ]; then
echo "$NAME already running..."
else
nohup $CMD > $LOG_FILE 2>&1 &
echo $! > $PID_FILE
echo "$NAME listener is started..."
fi
set +x
}

使用set -x將啟用詳細訊息傳遞,並將set +x停用它。這應該可以進一步說明您的腳本失敗的地方。

相關內容