我想创建一个在 Linux 上作为守护进程运行的 Java 控制台应用程序,我已经创建了该应用程序和脚本以将该应用程序作为后台守护进程运行。应用程序运行并等待命令行输入。
我的问题:
是否可以将命令行输入传递给正在运行的守护进程?
/proc
下都有一个特殊目录,其中包含进程的信息和挂钩。 /proc
的每个子目录都是正在运行的进程的PID。因此,如果您知道特定进程的 PID,您就可以获得有关它的信息。例如:
$ sleep 100 & ls /proc/$!
...
cmdline
...
cwd
environ
exe
fd
fdinfo
...
status
...
值得注意的是
fd
目录,其中包含与进程关联的所有 文件描述符。 0
、1
和2
(几乎?)所有进程都存在,0
是默认的标准输入。因此写入 /proc/$PID/fd/0
将写入该进程的 stdin。
一个更强大的替代方案是设置一个连接到进程的标准输入的命名管道;然后您可以写入该管道,进程将读取它,而无需依赖
/proc
文件系统。
另请参阅 ServerFault 上的写入后台进程的标准输入。
systemctl
管理的 Linux 守护进程上运行 Minecraft 服务器。我希望能够向
stdin
(标准输入)发送命令。首先,使用
mkfifo /home/user/server_input
在某处创建一个 FIFO 文件(也称为上面提到的“命名管道”解决方案)。
[Service]
ExecStart=/usr/local/bin/minecraft.sh
StandardInput=file:/home/user/server_input
然后,在守护程序 *.service
文件中,执行运行服务器或后台程序的 bash 脚本,并将StandardInput 指令设置为我们刚刚创建的 FIFO 文件。 在
minecraft.sh
中,以下是运行服务器并将输入通过管道传输到正在运行的服务的控制台的关键命令。
tail -f /home/user/server_input | java -Xms1024M -Xmx4096M -jar /path/to/server.jar nogui
最后,运行 systemctl start your_daemon_service
并传递输入命令,只需使用:
echo "command" > /home/user/server_input