Linuxでは、デタッチ後にコマンドを実行するために後で戻ってくることができるプロセスを実行するにはどうすればよいでしょうか。

Linuxでは、デタッチ後にコマンドを実行するために後で戻ってくることができるプロセスを実行するにはどうすればよいでしょうか。

私は現在、サーバー ホスティング アプリを開発しています (主に自分用/学習目的)。すべてがうまく機能しているわけではありませんが、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ため、パイプを開いたままにするには コマンドが必要です。echostartserver

答え2

3 つの方法が思い浮かびます。デーモン プロセスが stdin/out を使用している限り、デーモン プロセスとの通信に問題は発生しないはずです。

  1. screen、、または同様のソリューションを使用する場合tmux、サーバーを切り離す必要はありません。コンソールにサーバーを「接続」したままにして、画面自体を切り離しても安全です。

  2. /proc/N/fd/{0,1}適切な権限がある限り、通信に使用できます。ここで、N はデーモンの PID、fd0 は通常 stdin、fd1 は N プロセスの stdout です。

  3. 名前付きパイプ (FIFO) を使用するアプローチは本質的には正しいのですが、半分しか正しくありません。プロセスの stdout をパイプに変更したため、デーモンによって stdout に出力されるものはすべてパイプに書き込まれ、そこから cat などで抽出できるようになります。パイプは半二重であるため、1 つの入力と 1 つの出力しか接続できません。必要なのは 2 つのパイプで、1 つは入力用、もう 1 つは出力用です。すると、1 つのパイプを介してデーモンに送信したものはすべてそこに届き、応答はもう 1 つのパイプを介してパイプを読み取る別のプログラムに戻ります。

pin2 つのパイプとがあると仮定しますpout。以下を実行します。

デーモン < ピン > ぷっくり

次に、次のようなものを実行する必要があります。

猫のふくれっ面と猫 > ピン

通信するためです。これは悪い例です。非同期なので競合状態が発生する可能性がありますが、アイデアは伝わると思います。

関連情報