防止 init 守护进程在 TTY 上回显

防止 init 守护进程在 TTY 上回显

下面是init启动/停止守护进程的脚本。不幸的是,守护进程正在打印解析的数据包数据(来自/home/nuthan/program/server),这是一个用 perl 编写的套接字服务器,侦听来自客户端的 tcp 数据包的套接字。

一旦我启动服务,解析的数据(来自 的打印语句/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_functiondaemon -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到深渊 ( /dev/null) 并重定向stderrstdout重定向的位置来克服这个问题。/dev/null丢弃它收到的所有东西。所以这样的事情可以工作:

daemon -18 perl /home/nuthan/program/server -d -v -r -f -O=/var/log/vts.log --daemon >/dev/null 2>&1

相关内容