2012-02-15 24 views
0

如何獲取在tty2中啓動的進程的tty1中的pid?bash lsof:從一個tty獲取pid到另一個tty2

上下文:
試圖編寫一個bash單行程序來殺死一個進程生成一個文件,當這個文件超過預先定義的最大大小。 (單線程還沒有運行,因爲它需要將其嵌入到循環中)。

在測試過程中,問題是lsof不會在終端tty1返回任何PID,儘管pid存在於運行該命令的tty2中。

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'。 – 2012-02-29 19:20:59

回答

1

正如在另一個答案中提到的那樣,該文件僅在很短的時間內打開,所以你的捕獲率很低。

但是,您可以更改:

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

本品採用先進的外殼重定向 - 在EXEC行打開一個文件描述符,該> & 5命令輸出到文件描述符重定向。

如果這樣做,shell將對lsof可見。

+0

當然,這是完全正確的。 Thx,因爲我無法在exec man page中找到這個提示,因爲這個技巧使用了高級重定向。我會以這種方式進行調查。好主意,thx再次提示。 – hornetbzz 2012-02-29 22:01:32

1

的問題是,在TTY2過程打開該文件僅在分裂第二附加字符串。除非你在同一瞬間運行lsof,否則你不會理解它。

解決此問題的一種方法是使用inotify-tools。程序inotifywait允許您等待文件打開並運行lsof,例如inotifywait $file; lsof $file

+0

thx爲答案,但如果您閱讀醜陋的tty1單行,inotifywait已經是我正在使用的命令。 – hornetbzz 2012-02-15 21:14:00

+0

哦,對不起,我錯過了。嘗試在inotifywait後立即移動lsof部分。 – 2012-02-15 21:16:18

+0

和lsof站在inotify之後也挺直。 – hornetbzz 2012-02-17 21:26:06

相關問題