是否有可能向正在运行的服务或守护进程传递输入?
在Linux上,所有正在运行的进程都有一个特殊的目录`/proc`,其中包含进程的信息和钩子。`/proc`的每个子目录都是一个正在运行的进程的PID。因此,如果你知道特定进程的PID,你可以获取有关它的信息。例如:
$ sleep 100 & ls /proc/$! ... cmdline ... cwd environ exe fd fdinfo ... status ...
值得注意的是`fd`目录,它包含与进程相关联的所有文件描述符。`0`、`1`和`2`几乎对所有进程都存在,其中`0`是默认的标准输入(stdin)。因此,写入`/proc/$PID/fd/0`将写入该进程的标准输入(stdin)。
更可靠的替代方法是设置一个连接到你的进程标准输入(stdin)的命名管道(named pipe),然后你可以写入该管道,进程将读取它,而不需要依赖于`/proc`文件系统。
另请参阅ServerFault上的"Writing to stdin of background process"。
这需要1000倍的赞。
有时候,在运行的服务或守护程序中传递输入是可能的吗?这个问题的出现的原因是,有人在运行Linux守护程序(使用systemctl
)上的Minecraft服务器时,希望能够通过stdin
(标准输入)发送命令。他尝试了上面接受的答案,但并不适用于他的情况。
为了解决这个问题,他提供了自己的实现方法。他首先使用mkfifo /home/user/server_input
创建了一个FIFO文件(也称为上面提到的“命名管道”解决方案)。然后,在守护程序的*.service
文件中,执行运行服务器或后台程序的bash脚本,并将StandardInput指令设置为刚刚创建的FIFO文件。
在minecraft.sh
中,关键命令是运行服务器并将输入管道传递到运行服务的控制台的命令。
最后,运行systemctl start your_daemon_service
,要传递输入命令,只需使用echo "command" > /home/user/server_input
。
他还提到了在ServerFault上给出的答案。
如果你需要更多的上下文,请提供更多信息。
以上是这个问题的原因和解决方法。