0

这个主题大约有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, 然后电脑看起来崩溃了,什么也做不了。

我刚刚意识到的原因是以前我有一个围绕./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 秒和通话时间超过 3 秒的列表/bin/bash: line 9: 2973 Terminated ./analyze $f。整个运行可以被中断Ctrl+C(尽管有几次),并且输出可以被写入output.txt.

现在我意识到不再需要计时器了。所以我的问题是:

1)我如何在makefile没有计时器或我的 OCaml 代码的情况下进行修改,./analyze以便它可以被中断。

2)对于make list > output.txt,我怎么还能在终端打印一些简单的信息,而执行,让我看到它的进展?

4

1 回答 1

1

你需要摆脱那个 & 字符:

list:       all
            while IFS= read -r f; \
            do \
                ./analyze $$f & <--- *** THIS ONE ***
            done < list.txt

因为它告诉 shellanalyze在后台启动(并继续执行脚本)。这就是为什么你不能analyze用 ctrl-C 中断,很可能也是为什么你不能重定向它的输出(make 命令在你的analyze进程有机会写入它们的输出之前终止)。

于 2015-02-07T01:15:48.300 回答