我目前正在開發一個伺服器託管應用程式(主要用於我自己/學習目的),一切都很好,但我不知道你們中有多少人總體上熟悉《反恐精英》,但我啟動了我的伺服器和一切沒問題,但我與它分離(這都是用 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個進程的stdin,fd1是stdout。您使用命名管道(FIFO)的方法本質上是正確的,但您只做對了一半。您所做的是將進程的標準輸出更改為管道,這意味著守護程式列印到標準輸出的所有內容都將寫入管道,您可以從其中提取它,例如,cat。該管道是半雙工的,這意味著它只能將一個輸入與一個輸出連接。您需要的是兩個管道,一個用於輸入,一個用於輸出。然後,您透過一個管道發送到守護程序的任何內容都會到達那裡,而回應則透過另一個管道返回到另一個將讀取該管道的程式。
假設有兩個管道pin
和pout
。你跑:
守護程式<pin>噘嘴
然後你必須運行類似的東西
貓噘嘴和貓>別針
為了溝通。這是一個糟糕的例子,它可能有競爭條件,因為它是非同步的,但我希望你明白這個想法。