Я хочу, чтобы команда 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
отключит их. Это должно пролить дополнительный свет на то, где ваш скрипт дает сбой.