centos crontab if else 用法

本文介绍了一个关于CronTab定时任务的常见错误及其修正方法。通过对比错误和正确的定时任务脚本,详细解释了如何使用逻辑运算符来确保只有在进程不存在时才执行特定任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用场景

如果进程存在,则不执行。不存在则执行。

错误的定时

*/21 7-20 * * * pgrep -f crawler/run.py || python3.6 crawler/run.py > /dev/null 2>&1

正确的写法

*/21 7-20 * * * pgrep -f crawler/run.py; [ $? == 0 ] && python3.6 crawler/run.py > /dev/null 2>&1

解释

在shell中直接使用 || 可以,但是在 crontab 中却一直都不行。不断测试才发现是 || 的问题,但 && 是可以在crontab中使用的。最终改成[ $? == 0 ] 替代。

### 创建自动重启服务的 Shell 脚本 在 CentOS 系统中,可以通过编写一个简单的 Shell 脚本来监控特定的服务状态,并在其停止运行时重新启动该服务。以下是基于提供的引用内容以及常见实践的一个通用解决方案。 #### 1. 编写基础脚本 以下是一个用于监控并重启指定服务(例如 Tomcat 或 MySQL/MariaDB)的基础脚本: ```bash #!/bin/bash # 定义变量 SERVICE_NAME="mysqld" # 替换为目标服务名,如 tomcat 或 mysqld LOG_FILE="/var/log/${SERVICE_NAME}_restart.log" # 检查服务是否正在运行 check_service() { pgrep -x "${SERVICE_NAME}" >/dev/null 2>&1 } # 主逻辑循环 while true; do if check_service; then echo "$(date): ${SERVICE_NAME} is running." >> "${LOG_FILE}" else echo "$(date): ${SERVICE_NAME} not running! Attempting to restart..." >> "${LOG_FILE}" systemctl restart "${SERVICE_NAME}" || service "${SERVICE_NAME}" start if [ $? -eq 0 ]; then echo "$(date): Successfully restarted ${SERVICE_NAME}!" >> "${LOG_FILE}" else echo "$(date): Failed to restart ${SERVICE_NAME}. Please investigate manually." >> "${LOG_FILE}" fi fi sleep 60 # 每隔60秒检查一次 done ``` 此脚本通过 `pgrep` 命令检测目标服务的状态[^2],如果发现服务未运行,则尝试使用 `systemctl` 或传统的 `service` 命令来重启它[^3]。 --- #### 2. 设置脚本权限 为了使脚本能正常工作,需赋予其可执行权限: ```bash chmod +x /path/to/your_script.sh ``` --- #### 3. 配置定时任务 可以利用 cron 来定期调用这个脚本,或者让脚本本身保持常驻运行模式。如果是后者,建议将其作为后台守护进程启动。 ##### 使用 Cron 的方式 编辑用户的 crontab 文件以每分钟运行一次脚本: ```cron * * * * * /path/to/your_script.sh >> /var/log/cron_output.log 2>&1 ``` ##### 后台守护的方式 将脚本放入 `/etc/init.d/` 并配置为随系统启动加载,也可以直接通过 nohup 运行: ```bash nohup /path/to/your_script.sh & ``` --- #### 4. 开机自启设置 为了让脚本在系统重启后仍然能够自动运行,可以按照如下步骤操作: - **方法一:加入 rc.local** 将脚本路径添加至 `/etc/rc.d/rc.local` 中,并确保文件具有可执行权限。 ```bash chmod +x /etc/rc.d/rc.local echo "/path/to/your_script.sh &" >> /etc/rc.d/rc.local ``` - **方法二:创建 systemd 服务单元** 如果希望更灵活地管理脚本,推荐为其定义一个新的 systemd 服务单元文件: ```ini [Unit] Description=Auto Restart Service Script After=network.target [Service] ExecStart=/path/to/your_script.sh Restart=always [Install] WantedBy=multi-user.target ``` 存储为 `/etc/systemd/system/auto_restart.service`,然后启用并启动服务: ```bash systemctl enable auto_restart.service systemctl start auto_restart.service ``` --- #### 注意事项 - 确保脚本中的路径和服务名称正确无误。 - 日志记录对于调试非常重要,因此应始终保留日志功能。 - 对于高可用性需求较高的环境,可能还需要考虑额外的通知机制(如邮件告警),以便及时响应异常情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值