Bil*_*l K 11 scripting shell-script tail
我目前正在屏幕上运行服务器控制台程序,因为我需要阅读它并偶尔发送命令。
我想在后台将应用程序作为守护程序运行(使用 init 启动/停止它)。
我可以tail -f记录日志,但这不会让我向进程发送输入。
有什么方法可以设置它以便我可以读取和发送输入,但仍然让它在后台运行?
我还希望能够将来自不同进程的输入发送到守护程序(例如,可以发送“停止\n”命令的 shell 脚本)。
如果您希望守护进程读取由某个任意进程产生的输入,则需要将该进程连接到管道。这里的任意进程是您回显命令,它将在不同的上下文中运行。因此,创建一个命名管道(在 unix 上下文中通常称为 fifo)。
mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log
Run Code Online (Sandbox Code Playgroud)
只需将命令写入管道:
echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo
Run Code Online (Sandbox Code Playgroud)
然而,这不太可能正常工作:当守护进程在其标准输入上看到文件结尾时,很有可能会退出,一旦第一个写入管道的进程终止,就会发生这种情况。您可以使用tail -f来避免该问题。
</var/run/daemon.fifo tail -c +1 -f | {
echo $$ >/var/run/daemon.pid
exec /path/to/daemond --option >daemon.log
}
Run Code Online (Sandbox Code Playgroud)
对于某些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
Run Code Online (Sandbox Code Playgroud)
由于守护进程不会是服务管理器的子进程,因此您需要确保向正确的进程发送信号。如何做到这一点取决于守护进程的启动方式和启动方式。
将正在运行的进程附加到终端在技术上是可能的,但存在程序崩溃的风险,因此这绝对不适用于生产系统。
该-L选项使屏幕将其窗口中出现的所有内容写入文件。文件名daemon.screenrc在logfile指令中给出。