我目前正在屏幕上运行服务器控制台程序,因为我既需要阅读它,也需要偶尔发送命令。
我想在后台将应用程序作为守护程序运行(使用init启动/停止)。
我可以tail -f
记录日志,但是那不能让我向过程发送输入。
有什么方法可以进行设置,以便我既可以读取也可以发送输入,但仍在后台运行它?
我还希望能够从不同的进程向守护程序发送输入(例如,可以发送“ Stop \ n”命令的shell脚本)。
我目前正在屏幕上运行服务器控制台程序,因为我既需要阅读它,也需要偶尔发送命令。
我想在后台将应用程序作为守护程序运行(使用init启动/停止)。
我可以tail -f
记录日志,但是那不能让我向过程发送输入。
有什么方法可以进行设置,以便我既可以读取也可以发送输入,但仍在后台运行它?
我还希望能够从不同的进程向守护程序发送输入(例如,可以发送“ Stop \ n”命令的shell脚本)。
Answers:
如果希望守护程序读取某个任意进程产生的输入,则需要将该进程连接到管道。在这里,任意过程是您回显命令,它将在不同的上下文中运行。因此,创建一个命名管道(在Unix上下文中通常称为fifo)。
mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log
只需将命令写入管道:
echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo
但是,这不太可能正常工作:当守护程序在其标准输入上看到文件结束时,它很有可能会退出,该守护进程会在写入管道的第一个进程终止时立即发生。您可以tail -f
用来避免该问题。
</var/run/daemon.fifo tail -c +1 -f | {
echo $$ >/var/run/daemon.pid
exec /path/to/daemond --option >daemon.log
}
在某些tail
实现中,您可能会因缓冲而受苦:该tail
进程将等待,直到它积累了足够的字节以发出一些输出为止。我认为这在POSIX工具箱中无法解决;如果存在问题,请使用普通的C或Perl或Python程序。据我所知,tail
从GNU coreutils(在Linux和其他地方可以找到)在这方面是安全的。
当您停止守护程序时,echo >/var/run/daemon.fifo
将终止该进程tail
。
而不是直接从服务管理器中调用守护程序(实际上是在使用SysV init还是其他诸如包装脚本或Upstart之类的东西),而是调用
screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option
由于守护程序将不是服务管理器的子进程,因此您需要确保将信号发送到正确的进程。该如何执行取决于守护程序的启动方式以及启动方式。
从技术上讲,可以将正在运行的进程附加到终端上,但是有使程序崩溃的风险,因此对于生产系统来说绝对是这样。
该-L
选项使屏幕将其窗口中出现的所有内容写入文件。文件名daemon.screenrc
由logfile
指令指定。
stuff
命令)。但是您在这里不需要终端的开销(处理,但最重要的是认知),管道就足够了(用一个忽略文件结尾的中继过程就足够了)。你可能想尝试一点与<fifo cat
或<fifo tail -f | cat
在一个终端,并echo >fifo; echo >fifo
在另一端; 我想你会没事的。