这个帖子大约是2个问题......
我的makefile
的一部分如下:
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
,然后PC看起来崩溃了,什么都做不了。
我之前意识到之前的原因是我在./analyze
的呼叫周围有一个计时器。代码是
list: all
while IFS= read f; \
do \
./analyze $$f & \
PID=$$!; \
(sleep 3; kill $$PID) & \
wait $$PID; \
done < list.txt
sleep 3
然后,如果一个文件的调用花费超过3秒,它将被停止,下一个文件将被继续。在终端中,它显示的呼叫/bin/bash: line 8: kill: (2970) - No such process
列表少于3秒,/bin/bash: line 9: 2973 Terminated ./analyze $f
列表超过3秒。整个运行可以被Ctrl+C
中断(尽管多次),输出可以写入output.txt
。
现在我意识到不再需要计时器了。所以我的问题是:
1)如果没有计时器或makefile
的OCaml代码,我怎么能修改./analyze
以便它可以被中断。
2)对于make list > output.txt
,我怎样才能在执行过程中在终端中打印一些简单的信息,以便让我看到它的进展?
答案 0 :(得分:1)
你需要摆脱那个&符号:
list: all
while IFS= read -r f; \
do \
./analyze $$f & <--- *** THIS ONE ***
done < list.txt
因为它告诉shell在后台启动analyze
(并继续使用脚本)。这就是为什么你不能用ctrl-C中断analyze
,也很可能也是为什么你不能重定向它的输出(make命令在你的analyze
进程有机会写出输出之前终止)。