【问题标题】:Bash: Terminate on Timeout/File Overflow while Executing CommandBash:在执行命令时因超时/文件溢出而终止
【发布时间】:2010-04-14 05:41:56
【问题描述】:

我正在用 bash 编写一个模拟评分脚本。它应该执行一个 C 程序,该程序将提供一些输出(我将其重定向到一个文件。)我试图(1)在一定时间后使其超时,并且(2)如果输出文件到达某个文件则终止大小限制。不确定如何处理其中任何一个。有什么帮助吗?谢谢。

【问题讨论】:

    标签: bash shell scripting timeout overflow


    【解决方案1】:

    有一个 GNU coreutil 命令timeout 来执行超时。

    调查 ulimit -f 32 以设置最大文件大小(为 16 KiB;它以 512 字节块计)。

    反对:

    ulimit [not] 适合,因为我还必须创建其他文件。我只需要限制其中一个。

    计数器:除非程序必须创建一个大文件和一个小文件,并且您必须只限制小文件,否则您可以使用子shell来获得良好的效果:

    (
    ulimit -f 32
    timeout 10m -- command arg >file
    )
    

    文件大小的限制仅限于子shell中的命令(由括号标记)。

    【讨论】:

    • 我认为 ulimit 不合适,因为我还必须创建其他文件。我只需要限制其中一个。
    • 此解决方案适用于文件限制条件。但是,我不能使用 coreutils(必须运行它的机器没有安装它们。)还有其他超时选项吗?
    • @Chris,您可以在后台启动另一个脚本,该脚本会休眠 nnn 秒,然后向父 PID 发送信号,父 PID 可以使用trap 处理该信号。 Racey,但它应该可以工作。
    • GNU coreutils 类似于 'ls' - 当前版本的 coreutils(8.4 验证存在;6.12 验证不存在)包含 timeout
    【解决方案2】:

    你可以使用timeout命令例如

    timeout -s 9 5s ./c_program > file
    

    要检查文件大小,你可以统计文件,然后if/else

    limit=1234 #bytes
    size=$(stat -c "%s" file)
    if [ "$size"  -gt "$limit" ] ;then
      exit
    fi
    

    如果您无法使用这些 GNU 工具,另请参阅 here,或查看 here 以获得其他灵感。

    【讨论】:

      【解决方案3】:

      这会启动 yourcommand,通过 dd 将输出重定向到 youroutputfile 并在其上设置 10000000 字节的限制:dd em> 将终止并且 SIGPIPE 将被发送到 yourcommand

      yourcommand | dd of=youroutputfile bs=1 count=10000000 &
      

      这将等待 5 秒并杀死 yourcommand(如果尚未终止):

      sleep 5
      kill %yourcommand
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-18
        • 2014-08-29
        • 2018-03-26
        • 1970-01-01
        • 1970-01-01
        • 2018-03-03
        • 2018-10-20
        相关资源
        最近更新 更多