init 데몬이 TTY에서 에코되는 것을 방지합니다.

init 데몬이 TTY에서 에코되는 것을 방지합니다.

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)만 실행할 스크립트로 해석되고 모든 후속 인수는 전달된 인수로 해석됩니다.그 스크립트에

문제를 해결하기 위해 두 가지를 제안할 수 있습니다.

  1. perl명시적인 호출이 필요한지 확인합니다 . server스크립트의 첫 번째 줄에 올바른 인터프리터 선언이 포함되어 있고(가능함 /usr/bin/perl) 실행 가능한 비트가 설정된 경우 명시적인 호출이 필요하지 않습니다 perl.
  2. 명령 구문을 확인하십시오 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

stdoutabyss( /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

관련 정보