中断执行并在终端中打印部分信息



这个线程是关于 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+CCtrl+DCtrl+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进程有机会写入其输出之前终止)。

最新更新