如何让Shell脚本仅在23:00-01:00时间段执行指定命令?
问题分析与修复方案
原脚本的核心问题是跨天时间段的数值判断逻辑错误:
230000(23:00)作为数值远大于010000(01:00),所以[[ $currentTime -ge $prodStartTime && $currentTime -le $prodEndTime ]]这个条件永远不会成立,导致脚本永远不会执行进程捕获操作。
修复后的脚本
#!/bin/bash prodStartTime="230000" prodEndTime="010000" logfile=/tmp/processrunning.txt touch $logfile while true do currentTime=$(date +"%H%M%S") # 跨天时间段判断:要么是当天23:00之后,要么是次日01:00之前 if [[ $currentTime -ge $prodStartTime || $currentTime -le $prodEndTime ]]; then # 如果需要保留历史日志,将 > 改为 >> ps aux | sort -nrk 3,3 | head -n 5 > $logfile fi sleep 30 done
关键修改说明
- 把时间判断的
&&改为||,覆盖当天23:00到24:00和次日00:00到01:00两个区间 - 用
$(date +"%H%M%S")代替反引号,这是更现代、更安全的命令替换写法 - 移除了无意义的
else :分支,简化代码
后台运行注意事项
用nohup后台运行时,建议显式重定向输出,避免默认生成的nohup.out文件持续增大:
nohup ./script.sh > /dev/null 2>&1 &
如果需要保留脚本自身的运行日志,可以改为:
nohup ./script.sh > /tmp/script_run.log 2>&1 &
内容的提问来源于stack exchange,提问作者Aviator
相关产品推荐
相关产品推荐

