콘솔에서 특정 명령을 실행하면 제대로 작동하지만 시작 스크립트를 사용하여 실행하면... 오류가 발생합니다.
#!/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...
구문 오류가 발생하므로 아무 것도 실행되지 않습니다. a not
로 변경하면 !
구문 오류가 제거되더라도 이제 셸은 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
.)