2012-02-15 8 views
0

tty2で起動されたプロセスのtty1でpidを取得するにはどうすればよいですか?bash lsof:1つのttyから別のttyにpidを取得する

コンテキスト:
このファイルが定義済みの最大サイズを超えたときにファイルを生成するプロセスを終了させるためのbash 1ライナーを書き込もうとしています。 (これをループに埋め込む必要があるため、1ライナーはまだ動作していません)。

テスト中は、コマンドが実行されるtty2にpidが存在するにもかかわらず、lsofはターミナルtty1にPIDを返しません。

TTY1:ファイルとモニタリングを生成する変更

MAX_SIZE_Ko=10001;file=test_lsof;dd if=/dev/zero of=$file bs=1k count=800;inotifywait $file;SIZE_Ko=$(du -s $file | cut -f1); [[ "$SIZE_Ko" -gt "$MAX_SIZE" ]] && (PID=$(lsof $file | tail -n1 | awk -F" " '{ print $2 }') ; [[ ! -z $PID ]] && kill -9 $PID || echo "no running PID modifying $file") 

tty2:ファイルサイズを増加

for ((1; 1; 1));do echo -e "foobar\n" >> test_lsof; echo $((i++))" - pid="$$; done 
+0

あなたはtty2プロセスを制御できますか?もしそうなら、プロセスPIDを最初のプロセスで取得できる方法で、例えば 'test_lsof.pid'に書き込むなどして保存するほうがずっと良いと思います。答えは –

答えて

1

他の回答に記載されているように、ファイルは短時間だけ開くので、ファイルを捕捉する確率は低くなります。

しかし、あなたはそれを変更することができます。これは、高度なシェルのリダイレクトを使用しています

exec 5>test_lsof 
for ((1; 1; 1)); do 
    echo -e "foobar\n" >&5 
    echo $((i++))" - pid="$$ 
done 

- execの行は> & 5は、そのファイルディスクリプタにコマンドの出力をリダイレクトし、ファイルディスクリプタを開きます。

これを実行すると、シェルはlsofに表示されます。

+0

もちろん、それは完全に正しいです。 Thx、このテクニックは高度なリダイレクトを使用しているので、私はexecのmanページでこのヒントを見つけることができませんでした。私はその方法を調査します。良いアイデア、ヒントのためのthx再び。 – hornetbzz

1

問題tty2の処理のみスプリット秒付加するためのファイルを開くことです文字列あなたは同じ分割秒でlsofを実行しない限り、あなたはそれをキャッチしません。

これに対処する1つの方法は、inotify-toolsを使用することです。プログラムinotifywaitを使用すると、ファイルが開かれ、実行されるまで待つことができます。lsofinotifywait $file; lsof $file

+0

thxですが、醜いtty1ワンライナーを読むと、inotifywaitはすでに私が使用しているコマンドです。 – hornetbzz

+0

ああ申し訳ありませんが、私はそれを逃した。 inotifywaitの直後にlsofの部分を移動してみてください。 –

+0

とlsofはまた、inotifyの後にかなりまっすぐに立っています。 – hornetbzz

関連する問題