我正在尝试编写一个脚本,一直检查进程“XXX”是否被杀死,如果是,则显示带有来自/ proc / XXX_ID / fd / 1的文本的错误消息,然后重新开始。
我正在尝试使其适用于自定义瘦客户端发行版,其中不再需要包。 Linux 4.6.3TS_SMP i686
我是Bash脚本的新手,我似乎无法让它工作。我在谷歌上搜索并尝试了两天不同的事情,我无处可去。我做错了什么?
#!/bin/bash
while [ true ] ; do
process_ID="$(pgrep XXX)"
tail -f /proc/${process_ID}/fd/1 > /bin/test2.txt
到目前为止一切都有效。现在我需要以某种方式检查test2.txt是否为空,如果不是,请使用它中的文本作为错误消息并再次开始检查。我试过这样的事情
if [ -s /bin/test2.txt ]
then
err="$(cat /bin/test2.txt)"
notify-send "${err}"
else
fi
done
答案 0 :(得分:0)
这个怎么样:
output_filepath=$(readlink /proc/$pid/fd/1)
while ps $pid > /dev/null
do
sleep 1
done
tail "$output_filepath"
只有将进程的stdout(fd 1)重定向到可由其他人读取的文件时,整个想法才有效。这样的重定向将导致/proc/<pid>/fd/1
成为符号链接。我们在第一行读取并记住该符号链接的目标。
然后我们等到给定PID的ps
失败,这通常意味着该过程已经终止。然后我们在记忆的路径上尾随文件。
这种方法有几个缺点。进程(或其调用者)可以在终止时删除,修改或重命名输出文件,或者以某种方式读取它可能是不可能的(权限等)。输出可以被重定向到不是文件的东西(例如管道,插座等),然后拖尾它不会起作用。
ps
没有失败并不一定意味着同样的过程仍然存在。似乎很快就能重新使用PID,但并非完全不可能。