连续bash脚本 - 在进程终止时显示自定义错误

时间:2017-07-27 07:09:40

标签: linux bash

我正在尝试编写一个脚本,一直检查进程“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

1 个答案:

答案 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,但并非完全不可能。