这个线程是关于 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 秒,它将停止,下一个文件将继续。在终端中,它显示少于 3 秒的呼叫/bin/bash: line 8: kill: (2970) - No such process
列表,以及超过 3 秒的呼叫/bin/bash: line 9: 2973 Terminated ./analyze $f
列表。整个运行可以中断Ctrl+C
(尽管多次),输出可以写入output.txt
。
现在我意识到不再需要计时器。所以我的问题是:
1)如何在没有计时器或我的OCaml代码的情况下修改makefile
./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
进程有机会写入其输出之前终止)。