【发布时间】:2013-04-03 17:46:39
【问题描述】:
我正在使用使用 CTRL-C 来停止任务的程序,我想做的是将该任务运行一定的分钟数,然后让它像按下 CTRL-C 一样停止。我希望它像按 ctrl+c 一样停止的原因是因为它会在您停止程序时自动保存,而不是杀死它并可能丢失保存的数据。
编辑;我不想使用 cron,除非它停止我的脚本,它会让程序保存数据,我希望在 shell 脚本中完成。
【问题讨论】:
我正在使用使用 CTRL-C 来停止任务的程序,我想做的是将该任务运行一定的分钟数,然后让它像按下 CTRL-C 一样停止。我希望它像按 ctrl+c 一样停止的原因是因为它会在您停止程序时自动保存,而不是杀死它并可能丢失保存的数据。
编辑;我不想使用 cron,除非它停止我的脚本,它会让程序保存数据,我希望在 shell 脚本中完成。
【问题讨论】:
trap 语句捕获这些序列,并且可以编程为在捕获这些信号时执行命令列表。
-#!/bin/bash
trap "echo Saving Data" SIGINT
同时:
做
睡觉 60
完成
有关陷阱的信息:http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_02.html
【讨论】:
60秒后使用timeout command发送SIGINT:
timeout --signal=INT 60 /path/to/script.sh params
【讨论】:
如果你需要拦截ctrl+c,你应该使用trap builtin,像这样:
cleanup(){ # do something...; }
trap 'cleanup' 2
# rest of the code
2 on trap line 是 ctrl+c 发送的SIGINT 信号,见man 7 signals
【讨论】:
尝试以下方法:
#!/bin/bash
set -m
/path/to/script.sh params &
set +m
bg_pid=$!
sleep 60
kill -2 $bg_pid
这应该允许您使用Job Control 和set builtin 将SIGINT 发送到后台进程
【讨论】: