バックグラウンドプロセスの標準入力への書き込み


25

私はUbuntu 10.04ボックスを使用していて、ssh経由でバックグラウンドでサーバー(myserver&)を起動しました。サーバーは正常に動作していますが、サーバーを制御する唯一の方法はこのメソッドを使用するため、サーバーの標準入力を取得する方法が必要です。

既に実行中のプロセスの標準入力を取得する方法はありますか?明らかに、今これを行うつもりなら、stdinにリダイレクトするFIFOで開始しますが、残念ながら今のところ少し遅れています。

何か案は?


フォアグラウンドに戻すだけではできませんか?(「jobs」は現在のバックグラウンドプロセスをリストし、「fg $ X」はジョブをフォアグラウンドに戻し、ctrl + bはジョブを一時停止してシェルに戻ります。「bg」は一時停止したプロセスを背景)
symcbean

回答:


10

/ proc pidディレクトリへの書き込みを試すことができます。デーモンのpidが2000である場合、/ proc / 2000 / fd / 0への書き込みを試してください


ありがとう...私はこれを投稿した直後に(典型的な見た目で)見つけました。それはうまくいくようです(実際にプログラムにデータを送信する限り)。残念ながら、プログラムはコマンドを受け入れません。ローカルコンピューターでサーバーを実行してテストしたところ、データは表示されますが、プログラムはコマンドを認識しません。サーバー端末でEnterキーを手動で押す必要がありますが、認識されないコマンドが表示されます。たぶんいくつかのJavaの奇妙さ?私がこだわっている...
tajmorton

1
echo -e "something \ n"> / proc / 2000 / fd / 0はどうですか?
カトリエル

実は、これはなかれとしてsworkingされていないの/ proc / <PID> / FD / 0ポイントには/ dev / PTS <いくつかの数>少なくともいくつかのシステムで...
bk138

serverfault.com/questions/178457/…への最初の回答は、このアプローチは実際には機能しないことを指摘しています。
バリーカーター

2
これは実際には機能しません。通常、シェルは(パイプまたはリダイレクトが使用されていない場合)、同じファイル(通常は仮想端末)に設定されたファイル記述子0を使用してコマンドを開始します。コマンドは、読み込み FDからと書き込み FDにして(例えば、あなたのターミナルエミュレータとのSSHまたは直接以上)の仮想端末と通信します。他のプロセスは、(例えば通じ、そのファイルにアクセスする場合、)まったく同じことが起こる、すなわち書き込み、それには、端末にではなく、コマンドに書き込みます。2/dev/pty/...012/proc
Feuermurmel

29

入力として名前付きパイプ(fifo)を使用してサーバーを起動できます。

mkfifo /tmp/srv-input
cat > /tmp/srv-input &
echo $! > /tmp/srv-input-cat-pid
cat /tmp/srv-input | myserver &

cat > /tmp/srv-input &EOFを受信するようにサーバーを避けることが重要です。サーバーがEOFを受信しないように、少なくとも1つのプロセスでfifoを書面で開く必要があります。このコマンドのPIDは/tmp/srv-input-cat-pid、後のキルのためにファイルに保存されます。

サーバーをすでに起動しgdbている場合は、プロセスをアタッチしてstdinfifo にリダイレクトするなどのデバッガーを使用する必要があります。

gdb -p PID
call close(0)
call open(0, "/tmp/srv-input", 0600)

そして、以下のようなことをして、入力をサーバーに送信します(必要に応じて別のターミナルウィンドウで)。

echo "command" > /tmp/srv-input

EOFをサーバーに送信するには、cat > /tmp/srv-inputPIDがに保存されているプロセスを強制終了する必要があります/tmp/srv-input-cat-pid file

GDBの場合、GDBを終了するとEOFが送信されます。


1
/ proc / 2000 / fd / 0はすべてのシステムで標準ではないため、これは@katrielのアプローチよりもはるかに移植性の高いアプローチです。
Prior99

「cat> / tmp / srv-input&」を使用したトリックにより、頭痛の種が軽減されました。ありがとうございました!
Prior99

どう mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &?これにより、パイプも開いたままになります
...-bk138

@ bk138:尾は動作するはずですが、確実に知る方法は1つしかありません。テストです。
jfg956

tail動作しませんが、これを追加してジョブを終了します:cat /tmp/srv-input | myserver; kill -9 cat / tmp / srv-input-cat-pid` && rm / tmp / srv-input-cat * `
Thiago Macedo

4

上記と同じですが、「cat」は機能しませんでした。ファイルはEOFを取得し、1つのコマンドを送信した後に終了しました。

これは私のために働いた:

#!/bin/bash

mkfifo /tmp/srv-input
tail -f /tmp/srv-input | myserver &
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.