这篇文章有两个问题。。。
mymakefile
的一部分如下:
list: all
while IFS= read -r f; \
do \
./analyze $$f & \
done < list.txt
list.txt
包含一个文件名列表,然后make list
遍历该列表并将./analyze
应用于每个文件。我经常使用
make list > output.txt
来记录我打印到stdout
的所有内容。在这种情况下,终端中不显示任何内容。但我刚刚意识到我不能中断执行。我尝试了
Ctrl+C
、Ctrl+D
或Ctrl+Z
,然后电脑看起来崩溃了,什么也做不了。我刚刚意识到这一点的原因是,以前我在
./analyze
的调用周围有一个计时器。密码是list: all
while IFS= read f; \
do \
./analyze $$f & \
PID=$$!; \
(sleep 3; kill $$PID) & \
wait $$PID; \
done < list.txt
sleep 3
然后,如果一个带有文件的调用花费了3秒以上,它将被停止,并继续执行下一个文件。在终端中,显示小于3秒的呼叫的
/bin/bash: line 8: kill: (2970) - No such process
列表,大于3秒的呼叫的/bin/bash: line 9: 2973 Terminated ./analyze $f
列表。整个运行可以被Ctrl+C
中断(尽管多次),并且输出可以写入output.txt
。现在我意识到计时器不再是必要的了。所以我的问题是:
1)如何在没有计时器或
makefile
的OCaml代码的情况下修改./analyze
,以便中断它。2)对于
make list > output.txt
,如何在执行时在终端中打印一些简单的信息,使我能够看到它的进展? 最佳答案
你需要摆脱那个符号和字符:
list: all
while IFS= read -r f; \
do \
./analyze $$f & <--- *** THIS ONE ***
done < list.txt
因为它告诉shell在后台启动
analyze
(并继续执行脚本)。这就是为什么不能用ctrl-C中断analyze
的原因,也很可能是为什么不能重定向其输出(make命令在analyze
进程有机会写入其输出之前终止)。关于linux - 中断执行并在终端中打印部分信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19895313/