模拟场景

在CentOS中,新建一个定时任务,在每天的8、12、14、18点自动执行shell脚本

可以使用crontab命令来

  1. 打开终端,输入以下命令来编辑crontab文件
crontab -e
# 如果不是root用户,需要使用 sudo crontab -e
  1. 在编辑器中添加以下命令:
0 8,12,14,18 * * * /path/to/your/script.sh

如果你想每隔6个小时执行一次,可以使用以下方式:

0 */6 * * * /path/to/your/script.sh

这个语句的含义是每隔6小时执行一次 /path/to/your/script.sh 脚本。0表示每次执行的开始时间是整点,*/6表示每隔6小时执行一次,* * *表示每天、每月、每周都执行。

/path/to/your/script.sh 这里最好使用你的shell脚本的绝对路径

script.sh

pwd # /root
cd /var/lib/jenkins/workspace/IMCS
echo $(date) >> /var/lib/jenkins/workspace/log.txt
# echo $(pwd) >> /var/lib/jenkins/workspace/log.txt
git svn rebase >> /var/lib/jenkins/workspace/log.txt
git push origin master >> /var/lib/jenkins/workspace/log.txt

需要注意的是,第一行命令的pwd这里的输出结果是/root,不是script.sh所在的目录,我们如果要执行其他的命令,需要cd到相应的文件夹

检测crontab服务

为了使 crontab 的任务生效,确保已经启用了 crond 服务。可以通过以下命令检查服务是否已经启动:

systemctl status crond

如果没有启动,可以通过以下命令启动服务:

systemctl start crond

如果想要每次任务执行时收到执行的结果,可以在脚本中添加输出语句或将输出重定向到日志文件中。

查看crontab日志

可以使用以下命令来查看crontab最近的几条日志

tail /var/log/cron

其他问题

脚本没有按时执行

运行完脚本后,系统控制台显示了一个日志

You have mail in /var/spool/mail/root

我们查看内容

From root@ztkj-03.localdomain  Thu Mar 30 10:49:01 2023
Return-Path: <root@ztkj-03.localdomain>
X-Original-To: root
Delivered-To: root@ztkj-03.localdomain
Received: by ztkj-03.localdomain (Postfix, from userid 0)
id 91DE3A0F39; Thu, 30 Mar 2023 10:49:01 +0800 (CST)
From: "(Cron Daemon)" <root@ztkj-03.localdomain>
To: root@ztkj-03.localdomain
Subject: Cron <root@ztkj-03> /var/lib/jenkins/workspace/run.sh
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
Precedence: bulk
X-Cron-Env: <XDG_SESSION_ID=3466>
X-Cron-Env: <XDG_RUNTIME_DIR=/run/user/0>
X-Cron-Env: <LANG=en_US.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20230330024901.91DE3A0F39@ztkj-03.localdomain>
Date: Thu, 30 Mar 2023 10:49:01 +0800 (CST)

/bin/sh: /var/lib/jenkins/workspace/run.sh: Permission denied

如果你确认脚本内容是正确的,可能是因为脚本的权限不够

这里我们给脚本提权

chmod +x /var/lib/jenkins/workspace/run.sh

同时要注意脚本里面的命令,如果有需要提权的,也要处理。

例如,我们脚本文件里面使用了一个日志文件log.txt

我们给这个文件也提权

chmod 666 /path/to/your/file/log.txt

/path/to/your/file/log.txt是你的文件路径。