需求如下: 编译时会卡住,所以需要当终端上显示的编译信息在一段时间不更新后重新编译
1. 开始时认为编译信息写到标准输出时对应的编译线程的标准输出文件的修改时间会改变,所以想通过shell脚本取得编译的进程pid,然后将当前时间与文件/proc/pid/fd/1的修改时间比较。 但是现在发现编译信息写到标准输出后/proc/pid/fd/1的修改时间并不会改变。
上面的想法是否有其它的实现方法?
2. 还有一个想法是将编译信息重定向到文件,然后判断文件的修改时间或判断文件的最后一行是否有变化。但是因为编译信息很多,全写入文件估计会使文件特别大。
能不能使文件只保存最新的编译信息?
======================================================
问题解决了
其实是自己没有再多想一想,/proc/pid/fd/1是一个符号链接,指向的是/dev/pts/n,也就是编译的线程将stdout输出去了/dev/pts/n设备上了,而当终端有内容更新时/dev/pts/n的修改时间就会变化。
所以根据/dev/pts/n的修改时间就可以判断编译是否卡住了
PS:感谢两位回答,提供了另外的思路
其实我觉得全写到文件也不会有多大,我编译东西的时候都是这么做的: make &> make.log
。
如果还是想跳过文件的话,实现起来也很简单:开一个pipe,fork,child把pipe的输出端dup到stdout,然后system执行编译命令,父进程用select+超时等待这个pipe的输入端,超时的话就kill child,然后重新开pipe,fork...
tmux 有个 monitor-silence
选项,可以指定指定的窗口在指定的时间内没有输出则显示通知。有这个通知的窗口的标题会有 ~
字符。据此可以写个脚本来监视。
比如,单独开个 tmux session,然后连一个 client 过去,一个窗口里跑编译,另一个窗口里监视。
wid=@137
while true; do
win=$(tmux list-window -F '#{window_index} #{window_id} #{window_flags}' | grep "$wid.*~")
if [[ -n $win ]]; then
windex=$(echo $wid | cut -d' ' -f1)
tmux send-keys -t $windex ls c-m
tmux select-window -t $windex
tmux select-window -t \!
fi
sleep 1
done
开头的 $wid
是通过 tmux list-window
取得的。在 tmux 1.8 + zsh 5.0 中测试通过。