私は現在、サーバー ホスティング アプリを開発しています (主に自分用/学習目的)。すべてがうまく機能しているわけではありませんが、Counter-Strike 全般に詳しい方がどれくらいいるかはわかりませんが、サーバーを起動してすべて正常であるにもかかわらず、サーバーから切り離してしまう (これはすべて Node.js で記述されています) ため、使用したりscreen
何もしたりできません。ただし、基本的に、サーバーのレベルを変更したい場合、サーバーを手動で起動する場合は入力などを行うことができますchangelevel de_dust2
が、切り離されているため、このプロセスにコマンドを与える方法がありません。
FIFOとUnixソケットの使用について読んだことがありますが、それは私にエコーバックするだけのように思えます。FIFOを誤解しているかどうかはわかりませんが、
mkfifo /tmp/server
echo "./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
3 つの方法が思い浮かびます。デーモン プロセスが stdin/out を使用している限り、デーモン プロセスとの通信に問題は発生しないはずです。
screen
、、または同様のソリューションを使用する場合tmux
、サーバーを切り離す必要はありません。コンソールにサーバーを「接続」したままにして、画面自体を切り離しても安全です。/proc/N/fd/{0,1}
適切な権限がある限り、通信に使用できます。ここで、N はデーモンの PID、fd0 は通常 stdin、fd1 は N プロセスの stdout です。名前付きパイプ (FIFO) を使用するアプローチは本質的には正しいのですが、半分しか正しくありません。プロセスの stdout をパイプに変更したため、デーモンによって stdout に出力されるものはすべてパイプに書き込まれ、そこから cat などで抽出できるようになります。パイプは半二重であるため、1 つの入力と 1 つの出力しか接続できません。必要なのは 2 つのパイプで、1 つは入力用、もう 1 つは出力用です。すると、1 つのパイプを介してデーモンに送信したものはすべてそこに届き、応答はもう 1 つのパイプを介してパイプを読み取る別のプログラムに戻ります。
pin
2 つのパイプとがあると仮定しますpout
。以下を実行します。
デーモン < ピン > ぷっくり
次に、次のようなものを実行する必要があります。
猫のふくれっ面と猫 > ピン
通信するためです。これは悪い例です。非同期なので競合状態が発生する可能性がありますが、アイデアは伝わると思います。