SCRIPT_PATH="/var/dpcrestart.sh"
CRON_SCHEDULE="*/5 * * * *"
CRON_JOB="${CRON_SCHEDULE} /bin/bash ${SCRIPT_PATH}"
CURRENT_CRON=$(crontab -l 2>/dev/null)
if echo "$CURRENT_CRON" | grep -qE "${CRON_SCHEDULE}.*${SCRIPT_PATH}"; then
echo "Cron job is already set up."
else
(crontab -l 2>/dev/null; echo "${CRON_JOB}") | crontab -
if [ $? -eq 0 ]; then
echo "Cron job added successfully."
else
echo "Failed to add cron job."
fi
fi
这段代码是一个Shell脚本,用于在Linux系统中设置一个定时任务(cron job),确保一个名为`dpcrestart.sh`的脚本每5分钟执行一次。下面是对脚本的逐行解释:
1. `SCRIPT_PATH="/var/dpcrestart.sh"`:定义了一个变量`SCRIPT_PATH`,其值为脚本的路径`/var/dpcrestart.sh`。这个脚本是我们要定时执行的脚本。
2. `CRON_SCHEDULE="*/5 * * * *"`:定义了定时任务的执行计划。Cron的语法中,`*/5 * * * *`表示每5分钟执行一次。Cron的时间格式是字段由左到右依次为分钟、小时、日期、月份、星期几。
3. `CRON_JOB="${CRON_SCHEDULE} /bin/bash ${SCRIPT_PATH}"`:定义了完整的Cron任务字符串,将执行计划和脚本路径结合起来。这里使用`/bin/bash`来确保使用bash shell来执行脚本。
4. `CURRENT_CRON=$(crontab -l 2>/dev/null)`:获取当前用户的crontab列表,并将其存储在变量`CURRENT_CRON`中。`2>/dev/null`是将标准错误重定向到`/dev/null`,即忽略错误信息。
5. `if echo "$CURRENT_CRON" | grep -qE "${CRON_SCHEDULE}.*${SCRIPT_PATH}"; then`:使用`grep`命令检查当前的crontab中是否已经存在我们定义的定时任务。`-q`表示静默模式,不输出匹配的行,只返回状态码。`-E`表示使用扩展正则表达式。如果存在,则执行`then`之后的代码块。
6. `echo "Cron job is already set up."`:如果Cron任务已经设置,则打印这条消息。
7. `else`:如果没有找到Cron任务,则执行`else`之后的代码块。
8. `(crontab -l 2>/dev/null; echo "${CRON_JOB}") | crontab -`:首先获取当前的crontab列表,然后添加我们的Cron任务。`echo "${CRON_JOB}"`会输出我们的Cron任务字符串,然后通过管道`|`传递给`crontab -`,后者会更新crontab。
9. `if [ $? -eq 0 ]; then`:检查上一条命令的退出状态码。如果状态码为0(表示命令成功执行),则执行`then`之后的代码块。
10. `echo "Cron job added successfully."`:如果Cron任务成功添加,则打印这条消息。
11. `else`:如果Cron任务添加失败,则执行`else`之后的代码块。
12. `echo "Failed to add cron job."`:打印失败的消息。
**举例说明**:
假设你有一个脚本`/var/dpcrestart.sh`,你希望它每5分钟运行一次。你可以将上述脚本保存为一个文件,比如`setup_cron.sh`,然后在终端执行它:
chmod +x setup_cron.sh # 使脚本可执行
./setup_cron.sh # 执行脚本
如果脚本执行后输出`Cron job added successfully.`,则表示定时任务设置成功。如果输出`Cron job is already set up.`,则表示该定时任务已经存在于crontab中。如果输出`Failed to add cron job.`,则表示添加定时任务失败,可能需要检查脚本路径或crontab命令的权限。