繁体   English   中英

设置命令执行超时并将结果输出到文件

[英]Set timeout for command execution and output results to file

我有一个基本的script.sh,可以在其中运行一些命令。 脚本类似于:

(script.sh)

......
`gcc -o program program.c` 
 if [ $? -eq 0 ]; then
    echo "Compiled successfully....\n" >> out.txt

 #set a timeout for ./program execution and append results to file
 (gtimeout 10s ./program) 2> out.txt  # <-- NOT WORKING

......

我通过如下终端运行此脚本:

#Go to this directory,pass all folders to compile&execute the program.c file 
czar@MBP~$  for D in /Users/czar/Desktop/1/*; do sh script.sh $D; done

编辑:输出我进入终端,虽然不是那么重要:

# program.c from 1st folder inside the above path
Cycle l=1: 46 46
Cycle l=1: 48 48
Cycle l=2: 250 274 250
Cycle l=1: 896 896
.........
# program.c from 2nd folder inside the above path
Cycle l=1: 46 46
Cycle l=1: 48 48
Cycle l=2: 250 274 250
Cycle l=1: 896 896
.........

目标是将这些内容放入out.txt

我得到的输出几乎是我想要的:它会在那10秒内执行所有可能的操作,但不会将结果重定向到out.txt,而只会输出到终端。 我尝试了这里提出的所有建议但没有运气。

任何其他想法表示赞赏。

编辑2:注释中给出的解决方案。

基本方法比您从答案复制到完全不同的问题的命令要简单得多。 您只需要将标准输出重定向到文件即可:

# Use gtimeout on systems which rename standard Gnu utilities
timeout 10s ./program >> out.txt

但是,如果该程序被gtimeout ,则可能不会产生该程序生成的所有输出,因为该输出仍位于标准库中的缓冲区中。 (此缓冲区没有什么特别的;它只是第一次将数据写入流时由库函数分配的一块内存。)程序终止时,其内存返回给操作系统; 甚至没有人尝试确保将标准库缓冲区刷新到其各自的流。

共有三种缓冲模式:

  • 块缓冲:在流的缓冲区已满之前不会产生任何输出。 (通常,流的缓冲区大约为8kb,但因系统而异。)

  • 行缓冲:​​将换行符发送到流时产生输出。 如果缓冲区已满,它也会产生,但是很少有一行足够长以填充缓冲区。

  • 无缓冲:完全不执行缓冲。 每个字符都会立即发送到输出。

通常,除非将标准输出定向到端子,否则将对其进行块缓冲,在这种情况下,将对其进行行缓冲。 (这不能保证;各种标准允许很大的自由度。)行缓冲可能是您想要的,除非您习惯于编写编写部分行的程序。 (在每条输出行的开头而不是在末尾添加换行符的奇怪用法是一个非常糟糕的主意,因为这会破坏行缓冲。)无缓冲的输出是另一种可能,但是如果程序运行的话,这确实很慢产生大量的产出。

您可以通过调用setvbuf在将任何数据写入流之前更改缓冲模式:

/* Line buffer stdout */    
setvbuf(stdout, NULL, _IOLBF, 0);

(有关更多选项,请参见man setvbuf 。)

您还可以通过调用fflush告诉库立即发送任何缓冲的数据:

fflush(stdout);

如果您不希望行缓冲的(少量)开销是一种有效的技术,但是您知道什么时候发送数据很重要(通常是因为程序将要进行很长的计算或等待一些外部事件) )。

如果您无法修改源代码,则可以在启动程序之前使用Gnu实用程序stdbuf更改缓冲模式。 stdbuf不适用于所有程序-例如,如果程序确实调用setvbuf ,它将不会有任何效果-但通常是有效的。 例如,要行缓冲stdout,可以执行以下操作:

timeout 10s stdbuf -oL ./program >> out.txt
# Or: gtimeout 10s gstdbuf -oL ./program >> out.txt

有关更多信息,请参见man stdbuf

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM