Beim Beobachten der Skriptausführung mit Monit-Skript werden Pipes scheinbar ignoriert

Beim Beobachten der Skriptausführung mit Monit-Skript werden Pipes scheinbar ignoriert

Ich möchte einen Bash-Befehl im Hintergrund laufen lassen, der von monit überwacht wird. Um die PID dieses Prozesses zu erhalten, habe ich dieses Skript im Internet gefunden und es so geändert, dass es zu meinen Befehlen passt: (mit dem Namen 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

Wenn ich den Befehl ausführe

/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

In meinem Bash-Befehl funktioniert es einwandfrei. Aber wenn ich Folgendes mache, sdr.sh starterhalte ich die folgende Fehlermeldung:

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

Wie Sie sehen, -aist dies ein Parameter von multimon-ngund nicht von rtl_fm. Es scheint, dass dieses Pipe nicht als Pipe interpretiert wird.

Antwort1

Ich vermute, dass diese ps ... grepZeile in Ihrer startnotification()Funktion zusätzliche Informationen zurückgibt. Um dies weiter zu debuggen, würde ich das Skript zunächst mit aktiviertem Debugging ausführen.

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
}

Durch die Verwendung von set -xwird die ausführliche Nachrichtenübermittlung aktiviert bzw. set +xdeaktiviert. Dies sollte zusätzliche Aufschluss darüber geben, wo Ihr Skript fehlschlägt.

verwandte Informationen