下面是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
) 解释为要运行的脚本,并将后面的所有参数解释为传递的参数到那个脚本
我可以建议两件事来解决问题:
- 确定是否需要
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
到深渊 ( /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