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
세 가지 명령을 혼합하고 있습니다.deamon
,perl
그리고/home/nuthan/program/server
따옴표 없이. 다음 사항을 고려하십시오.어떤 매개변수가 해석되어야 하는지 각각은 어떻게 알 수 있습니까?
사용하는 구문은 다음과 같은 경우에만 올바르게 해석될 수 있습니다.
deamon
-18
그 이후의 모든 것을 실행 명령으로 처리합니다.perl
첫 번째 인수(/home/nuthan/program/server
)만 실행할 스크립트로 해석되고 모든 후속 인수는 전달된 인수로 해석됩니다.그 스크립트에
문제를 해결하기 위해 두 가지를 제안할 수 있습니다.
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