如何按指定时间条件执行对应定时命令(如不同ls命令)?
嘿,这个需求太常见了!给你两个最实用的实现方式,按需选就行:
方案1:用系统自带的cron(推荐)
cron是Linux/Unix系统默认的定时任务调度器,专门用来处理这种定点执行命令的场景,配置简单还稳定。
你只需要给每个时间点对应的命令写一条cron规则就行,cron的格式是:分钟 小时 日 月 周 要执行的命令。针对你的需求,对应的规则如下:
- 00:20执行
ls:20 0 * * * /bin/ls - 04:20执行
ls -l:20 4 * * * /bin/ls -l - 08:20执行
ls -ltr:20 8 * * * /bin/ls -ltr - 12:20执行
ls -ltrh:20 12 * * * /bin/ls -ltrh
配置步骤:
- 打开cron编辑器:执行
crontab -e(第一次可能会让你选编辑器,选vim或者nano都行) - 把上面的4行规则粘贴进去
- 保存退出,cron会自动加载新的任务,无需重启
小提醒:最好用命令的绝对路径(比如/bin/ls),因为cron的环境PATH比普通用户的窄很多,直接写ls可能会出现“命令找不到”的错误。如果想记录执行日志,可以把输出重定向到文件,比如:20 0 * * * /bin/ls >> /var/log/ls_cron.log 2>&1
方案2:写一个Shell脚本循环检测时间
如果不想依赖cron,或者需要在一个脚本里统一管理所有任务,那可以写个循环检测时间的脚本,逻辑很直观:
#!/bin/bash while true; do # 获取当前时间的「小时:分钟」格式,比如"00:20" current_time=$(date +"%H:%M") # 匹配对应时间,执行指定命令 case $current_time in "00:20") echo "[$(date)] 执行ls命令..." /bin/ls # 睡61秒,避免同一分钟内重复执行 sleep 61 ;; "04:20") echo "[$(date)] 执行ls -l命令..." /bin/ls -l sleep 61 ;; "08:20") echo "[$(date)] 执行ls -ltr命令..." /bin/ls -ltr sleep 61 ;; "12:20") echo "[$(date)] 执行ls -ltrh命令..." /bin/ls -ltrh sleep 61 ;; *) # 没到目标时间就睡60秒,再重新检查 sleep 60 ;; esac done
使用步骤:
- 把上面的代码保存为
timed_tasks.sh - 给脚本加执行权限:
chmod +x timed_tasks.sh - 后台运行脚本:
nohup ./timed_tasks.sh &(这样就算你退出终端,脚本也会继续在后台运行)
如果需要开机自动启动这个脚本,可以把nohup /path/to/timed_tasks.sh &加到/etc/rc.local文件里(注意要写脚本的绝对路径),或者用systemd配置一个服务(这个适合更严谨的生产环境)。
内容的提问来源于stack exchange,提问作者Kaverappa KU




