我目前正在开发一个服务器托管应用程序(主要用于我自己/学习目的),一切都运行良好,我不知道你们中有多少人熟悉反恐精英,但我启动了我的服务器,一切正常,但我与它分离(这都是用 Node.js 编写的)所以我不能使用screen
或什么都不能,但基本上如果我想更改服务器上的级别,如果我要手动启动服务器,我就可以输入changelevel de_dust2
或其他东西,但由于我已分离,我无法给这个过程任何命令。
我读过关于 FIFO 和使用 Unix 套接字的文章,但它似乎只是给我回显信息,我不确定我是否误解了 FIFO,但我认为我可以
mkfifo /tmp/server
回显“。/startserver”> / tmp / server&
然后如果我想
echo "changelevel de_dust2" > /tmp/server
抱歉,如果我不清楚,基本上我有一个想要向其发送命令的守护进程。
答案1
您必须确保您的“守护进程”从管道读取。
mkfifo /tmp/server
./startserver < /tmp/server &
sleep 10000 > /tmp/server &
稍后,您写入的任何内容/tmp/server/
都会出现在startserver
的标准输入中,例如:
echo "changelevel de_dust2" > /tmp/server
注意:该sleep
命令对于保持管道打开是必要的,因为每个echo
命令在结束时都会尝试关闭它,从而可能终止startserver
。
答案2
我想到三种方法。只要守护进程使用 stdin/out,与其通信就不会有问题。
如果您使用
screen
、tmux
或类似的解决方案,则不必拆卸服务器。您可以安全地将其“连接”到控制台并拆卸屏幕本身。/proc/N/fd/{0,1}
只要您拥有适当的权限,您就可以使用它进行通信,其中 N 是守护进程的 PID,fd0 通常是 N 进程的标准输入,而 fd1 是 N 进程的标准输出。您使用命名管道 (FIFO) 的方法本质上是正确的,但您只做对了一半。您所做的是将进程的标准输出更改为管道,这意味着守护进程打印到标准输出的所有内容都会写入管道,您可以从那里通过 cat 提取它。管道是半双工的,这意味着它只能连接一个输入和一个输出。您需要两个管道,一个用于输入,一个用于输出。然后,您通过一个管道发送给守护进程的任何内容都会到达那里,而响应将通过另一个管道返回到将读取管道的另一个程序。
假设有两个管道pin
和pout
。运行:
守护进程 < pin > pout
然后你必须运行类似
猫咪撅嘴 & 猫咪 > 别针
以便进行通信。这是一个不好的例子,因为它是异步的,所以可能会出现竞争条件,但我希望你能明白我的意思。