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-ngrtl_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無効になります。これにより、スクリプトが失敗した場所に関する追加の洞察を得ることができます。

おすすめ記事