当我在控制台中运行特定命令时,它工作正常,但是当我使用启动脚本运行时......它会抛出错误。
#!/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)”周围的额外引号。结果被提供给一个新的 shell,它会看到以下内容:
/root/amr/bin/pcdaemon --daemon -i ens192 -f udp && portrange 3000-8000 && not(src host localhost)
并将其作为命令行运行。这&&
是不是此时被引用,因此它由 shell 解释,其中的foo && bar
意思是“运行 foo,然后如果成功,则运行 bar”。当它发生时,not(src...
会触发语法错误,因此不会运行任何内容。将 更改not
为 a!
不会有帮助,因为即使它消除了语法错误,shell 现在也会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
。)