【问题标题】:Shell script do timed task stop and repeat?Shell脚本是否定时任务停止并重复?
【发布时间】:2013-04-03 17:46:39
【问题描述】:

我正在使用使用 CTRL-C 来停止任务的程序,我想做的是将该任务运行一定的分钟数,然后让它像按下 CTRL-C 一样停止。我希望它像按 ctrl+c 一样停止的原因是因为它会在您停止程序时自动保存,而不是杀死它并可能丢失保存的数据。

编辑;我不想使用 cron,除非它停止我的脚本,它会让程序保存数据,我希望在 shell 脚本中完成。

【问题讨论】:

    标签: bash shell timeout


    【解决方案1】:

    trap 语句捕获这些序列,并且可以编程为在捕获这些信号时执行命令列表。

    -#!/bin/bash

    trap "echo Saving Data" SIGINT

    同时:
    做 睡觉 60
    完成

    有关陷阱的信息:http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_02.html

    【讨论】:

    • 我还是不明白,似乎陷阱只有在我按 ctrl+c 时才有效?我想要做的是在一定时间内完成一项任务,比如 2 分钟,然后我希望它自动停止任务,就像有人按 ctrl + c 然后循环返回并再次执行任务一样两分钟。
    【解决方案2】:

    60秒后使用timeout command发送SIGINT

    timeout --signal=INT 60 /path/to/script.sh params
    

    【讨论】:

      【解决方案3】:

      如果你需要拦截ctrl+c,你应该使用trap builtin,像这样:

      cleanup(){ # do something...; }
      
      trap 'cleanup' 2
      
      # rest of the code
      

      2 on trap line 是 ctrl+c 发送的SIGINT 信号,见man 7 signals

      【讨论】:

      • 陷阱清理后的 2 是什么意思?
      【解决方案4】:

      尝试以下方法:

      #!/bin/bash
      set -m
      /path/to/script.sh params &
      set +m
      
      bg_pid=$!
      
      sleep 60
      
      kill -2 $bg_pid
      

      这应该允许您使用Job Controlset builtinSIGINT 发送到后台进程

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多