如何修改/etc/crontab,以root身份实现指定时段的进程启停控制?
如何通过/etc/crontab实现特定时段终止进程(含例外窗口)
咱们一步一步来搞定这个需求:要以root身份在周一至周六的08:00-16:00每隔一分钟终止目标进程,但给12:00-12:30、16:00-次日07:59留足进程运行的时间。
核心思路
crontab的时间规则是分钟 小时 日 月 星期,而/etc/crontab还多了一个「执行用户」字段。我们需要把要杀进程的时段拆分成三个部分,避开12:00-12:29的窗口,同时让16:00之后到次日07:59完全不执行杀进程命令。
具体步骤
1. 确定目标进程的匹配方式
首先得明确要终止的进程,推荐用pkill -f来匹配进程的完整命令行(避免误杀同名进程)。比如你的进程是my_annoying_process,命令就是:
pkill -f "my_annoying_process" || true
加上|| true是为了防止进程不存在时crontab发送错误邮件,让命令执行始终返回成功状态。
2. 编辑/etc/crontab
用root权限打开/etc/crontab(比如用vim或nano):
sudo nano /etc/crontab
在文件末尾添加以下三个条目(注意替换my_annoying_process为你的实际进程名):
# 周一至周六 08:00-11:59 每分钟杀进程 * 8-11 * * 1-6 root pkill -f "my_annoying_process" || true # 周一至周六 13:00-15:59 每分钟杀进程 * 13-15 * * 1-6 root pkill -f "my_annoying_process" || true # 周一至周六 12:30-12:59 每分钟杀进程 30-59 12 * * 1-6 root pkill -f "my_annoying_process" || true
3. 让crontab生效
大多数现代系统会自动加载/etc/crontab的修改,但保险起见可以重启cron服务:
- 基于systemd的系统(如Ubuntu 16.04+、CentOS 7+):
sudo systemctl restart cron - 基于init的系统(如CentOS 6):
sudo service crond restart
4. 验证配置
可以用以下命令检查/etc/crontab里的规则是否正确:
grep "my_annoying_process" /etc/crontab
规则解释
- 第一个条目:
* 8-11 * * 1-6表示周一到周六的8点到11点,每分钟执行一次杀进程命令。 - 第二个条目:
* 13-15 * * 1-6覆盖周一到周六的13点到15点,每分钟执行。 - 第三个条目:
30-59 12 * * 1-6只在周一到周六的12点30分到59分执行,避开了12:00-12:29的窗口。 - 16:00之后到次日07:59没有对应的crontab条目,所以不会执行杀进程命令,进程可以正常运行。
内容的提问来源于stack exchange,提问作者user786034




