シェルスクリプトで「予期しないトークン付近の構文エラー」エラーが発生します。

シェルスクリプトで「予期しないトークン付近の構文エラー」エラーが発生します。

コンソールで特定のコマンドを実行すると正常に動作しますが、起動スクリプトを使用して実行するとエラーが発生します。

#!/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。)

おすすめ記事