我想让 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
禁用它。这应该可以进一步说明您的脚本失败的地方。