在 Linux 中,如何运行一个进程,并在分离后返回发出命令

在 Linux 中,如何运行一个进程,并在分离后返回发出命令

我目前正在开发一个服务器托管应用程序(主要用于我自己/学习目的),一切都运行良好,我不知道你们中有多少人熟悉反恐精英,但我启动了我的服务器,一切正常,但我与它分离(这都是用 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,与其通信就不会有问题。

  1. 如果您使用screentmux或类似的解决方案,则不必拆卸服务器。您可以安全地将其“连接”到控制台并拆卸屏幕本身。

  2. /proc/N/fd/{0,1}只要您拥有适当的权限,您就可以使用它进行通信,其中 N 是守护进程的 PID,fd0 通常是 N 进程的标准输入,而 fd1 是 N 进程的标准输出。

  3. 您使用命名管道 (FIFO) 的方法本质上是正确的,但您只做对了一半。您所做的是将进程的标准输出更改为管道,这意味着守护进程打印到标准输出的所有内容都会写入管道,您可以从那里通过 cat 提取它。管道是半双工的,这意味着它只能连接一个输入和一个输出。您需要两个管道,一个用于输入,一个用于输出。然后,您通过一个管道发送给守护进程的任何内容都会到达那里,而响应将通过另一个管道返回到将读取管道的另一个程序。

假设有两个管道pinpout。运行:

守护进程 < pin > pout

然后你必须运行类似

猫咪撅嘴 & 猫咪 > 别针

以便进行通信。这是一个不好的例子,因为它是异步的,所以可能会出现竞争条件,但我希望你能明白我的意思。

相关内容