init
以下は、デーモンを起動/停止するスクリプトです。残念ながら、デーモンは/home/nuthan/program/server
クライアントからのTCPパケットをソケットから受信するPerlで書かれたソケットサーバーである解析されたパケットデータ(から)を印刷しています。
サービスを開始すると、解析されたデータ(printステートメントで/home/nuthan/program/server
)が私のTTYにエコーされます。また、ターミナルを終了しようとするとデーモンが終了します。この問題をどのように克服できますか?
デーモンとロギングパケットデータコマンド
daemon -18 perl /home/nuthan/program/server -d -v -r -f -O=/var/log/vts.log --daemon
#!/bin/bash
#
# vts Start/Stop Vts.
#
# description: VTS daemon for vehicle Tracking.
# Source function library
. /etc/init.d/functions
# Get network config
. /etc/sysconfig/network
RETVAL=0
start() {
echo -n $"Starting vts: "
# Start me up!
daemon -18 perl /home/nuthan/program/server -d -v -r -f -O=/var/log/vts.log --daemon
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/vts
touch /var/lock/subsys/vts
return $RETVAL
}
stop() {
echo -n $"Stopping vts: "
killproc vts
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/vtsdaemon
return $RETVAL
}
restart() {
stop
start
}
reload() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status vts
;;
restart)
restart
;;
condrestart)
[ -f /var/lock/subsys/vts ] && restart || :
;;
reload)
reload
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
exit 1
esac
exit 0
答え1
3つのコマンドを混ぜています。deamon
、perl
そして/home/nuthan/program/server
引用符なし。次の点を考慮してください。どのパラメータを解釈する必要があるかは、それぞれどうすればわかりますか?
使用する構文は、次の場合にのみ正しく解釈できます。
deamon
-18
それ以降のすべてを実行コマンドとして処理します。perl
最初の引数(/home/nuthan/program/server
)のみを実行するスクリプトとして解釈され、その後のすべての引数は渡された引数として解釈されます。そのスクリプトに
問題を解決するために2つのことを提案できます。
perl
明示的な呼び出しが必要であることを確認してください。server
スクリプトの最初の行に正しいインタプリタ宣言が含まれており(可能/usr/bin/perl
)、実行可能ビットが設定されている場合は、明示的な呼び出しは必要ありませんperl
。- コマンド構文を確認してください
daemon
。-18
コマンドは、それ以降のすべてが実行される完全なコマンドと見なされるべきであることを示していれば大丈夫です。それ以外の場合は、次のすべての項目を引用符で囲むか、追加の引用符を作成する必要があります。機能またはラッパースクリプトdaemon -18 your_function
これでコマンド全体が実行されます。したがって、作成したコマンドライン全体がまたはに変わりますdaemon -18 /path/to/your/wrapper_script.sh
。
答え2
daemon -18 perl /home/nuthan/program/server -d -v -r -f -O=/var/log/vts.log --daemon
RETVAL=$? 2>&1 1>/some/where/over_the_rainbow
ただし、-Oは「デーモン」が実行する必要があるのと同じことをすでに実行しているように見えるため、目に見えるよりも多くのことがあります。
答え3
stdout
abyss(/dev/null
)にリダイレクトし、リダイレクトされた場所stderr
にリダイレクトすることでこの問題を克服できます。受信したすべてを破棄します。したがって、次のように動作できます。stdout
/dev/null
daemon -18 perl /home/nuthan/program/server -d -v -r -f -O=/var/log/vts.log --daemon >/dev/null 2>&1