在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個進程的stdin,fd1是stdout。

  3. 您使用命名管道(FIFO)的方法本質上是正確的,但您只做對了一半。您所做的是將進程的標準輸出更改為管道,這意味著守護程式列印到標準輸出的所有內容都將寫入管道,您可以從其中提取它,例如,cat。該管道是半雙工的,這意味著它只能將一個輸入與一個輸出連接。您需要的是兩個管道,一個用於輸入,一個用於輸出。然後,您透過一個管道發送到守護程序的任何內容都會到達那裡,而回應則透過另一個管道返回到另一個將讀取該管道的程式。

假設有兩個管道pinpout。你跑:

守護程式<pin>噘嘴

然後你必須運行類似的東西

貓噘嘴和貓>別針

為了溝通。這是一個糟糕的例子,它可能有競爭條件,因為它是非同步的,但我希望你明白這個想法。

相關內容