繁体   English   中英

bash lsof:将pid从一个tty转换为另一个

[英]bash lsof : get pid from one tty to another one

如何在tty2中启动的进程的tty1中获取pid?

内容:
尝试编写bash单行代码以杀死该文件超过预定义的最大大小的生成文件的进程。 (单线尚未运行,因为需要将其嵌入循环中)。

在测试期间,关键是lsof不会在终端tty1中返回任何PID,尽管在运行命令的tty2中存在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

问题在于,tty2中的进程仅在瞬间将文件打开以追加字符串。 除非您在同一瞬间运行lsof,否则您将无法捕获它。

解决此问题的一种方法是使用inotify-tools 程序inotifywait允许您等待文件打开并运行lsof ,例如inotifywait $file; lsof $file inotifywait $file; lsof $file

如另一个答案所述,该文件仅在短时间内打开,因此lsof捕获该文件的几率很低。

但是,您可以更改以下内容:

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

这使用高级Shell重定向-exec行打开文件描述符,>&5将命令的输出重定向到该文件描述符。

如果这样做,该外壳将对lsof可见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM