[英]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.