コンソールで特定のコマンドを実行すると正常に動作しますが、起動スクリプトを使用して実行するとエラーが発生します。
#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....
# Source function library.
. /etc/init.d/functions
start() {
# code to start app comes here
# example: daemon program_name &
daemon /root/amr/bin/LoggerServer &
daemon /root/amr/bin/mediaController -i 192.168.117.119 &
daemon /root/amr/bin/mstdaemon --daemon
daemon /root/amr/bin/pcdaemon --daemon -i ens192 -f "udp && portrange 3000-8000 && not(src host localhost)" &
daemon /root/amr/bin/stund &
daemon /root/amr/bin/tdaemon &
#/root/amr/bin/start.sh &
}
stop() {
# code to stop app comes here
# example: killproc program_name
killproc LoggerServer
killproc mediaController
killproc mstdaemon
killproc pcdaemon
killproc stund
killproc tdaemon
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
# code to check status of app comes here
# example: status program_name
status LoggerServer
status mediaController
status mstdaemon
status pcdaemon
status stund
status tdaemon
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
esac
exit 0
間違い:
/bin/bash: -c: line 0: syntax error near unexpected token `src'
/bin/bash: -c: line 0: `ulimit -S -c 0 >/dev/null 2>&1 ; /root/amr/bin/pcdaemon --daemon -i ens192 -f udp && portrange 3000-8000 && not(src host localhost)'
コマンドラインから実行:./pcdaemon --daemon -i ens192 -f "udp && portrange 3000-8000 && not(src host localhost)"
ベストアンサー1
/etc/init.d/functions
既存のCentOSシステムの内部を見ると、daemon
機能は効果的に機能します。
/bin/bash -c "[...] ; $*"
$*
次に展開関数の引数はスペースで区切られているため、「udp...localhost)」の周りの追加の引用符は事実上失われます。結果は、次のことを確認する新しいシェルに提供されます。
/root/amr/bin/pcdaemon --daemon -i ens192 -f udp && portrange 3000-8000 && not(src host localhost)
コマンドラインで実行してみてください。&&
これはいいえfoo && bar
この時点で引用され、シェルでは「fooを実行し、成功したらbarを実行してください」という意味に解釈されます。この場合、not(src...
構文エラーが発生するため、何も実行されません。 anot
に変更すると、!
構文エラーが削除されても、シェルは引数が切り捨てられた状態pcdaemon
で実行され、名前付きプログラムを実行しようとするので役に立ちませんportrange
。
Red Hatにスクリプトを変更させる代わりに、pcdaemon
(提案されているように)自分のスクリプトにコマンドラインを置くことでこの問題を解決できます。マーク・プロニック)または他の引用符セットを追加してください。現在daemon
の機能では、次のように動作する必要があると思います。
daemon /root/amr/bin/pcdaemon --daemon -i ens192 -f "'udp && portrange 3000-8000 && not(src host localhost)'"
(誰かが実際にこの機能を修正した場合は、追加のdaemon
引用符が提供されますpcdaemon
。)