시스템 튜토리얼 리눅스 Linux에서 crontab의 문제점 및 문제 해결 방법

Linux에서 crontab의 문제점 및 문제 해결 방법

Feb 15, 2024 am 10:00 AM
linux crontab 리눅스 비디오

으아악

으아악

실제 작업에서 crontab에는 다양한 문제가 있습니다. 다음은 특정 작업에서 crontab에서 발생할 수 있는 문제와 해결 방법을 심도있게 소개합니다.

1. 크론탭으로 할 수 있는 일

crond는 Linux에서 특정 작업을 주기적으로 수행하거나 개별 사건 처리를 기다리는 데 사용되는 데몬 프로세스입니다. Windows의 예약된 작업과 유사하며 이 서비스 도구는 기본적으로 설치되며 수동으로 시작됩니다. crond 프로세스는 1분마다 실행할 작업이 있는지 정기적으로 감지합니다.

Linux의 작업 스케줄링은 시스템 작업 스케줄링과 사용자 작업 스케줄링의 두 가지 범주로 나뉩니다.

crontab의 용도와 관련하여 실제 기업 애플리케이션에서 매우 널리 사용됩니다. 일반적인 용도로는 예약된 데이터 백업, 예약된 시스템 확인, 예약된 데이터 수집, 예약된 구성 업데이트, 예약된 보고서 생성 등이 있습니다.

2. 크론탭 적용 예시

1. 크론탭 사용 형식

일반적으로 사용되는 crontab 형식은 다음과 같습니다.

으아악

옵션의 의미는 다음과 같습니다.

2.Crontab 파일 문장 패턴

사용자가 작성한 crontab 파일에서 각 줄은 작업을 나타내고, 각 줄의 각 배열은 6개의 배열로 구분됩니다. 처음 5개 세그먼트는 시간 설정 세그먼트이고, 여섯 번째 세그먼트는 실행될 명령 세그먼트의 형식은 다음과 같습니다.

으아악

그 중:

?분: 분을 나타내며 0에서 59 사이의 정수일 수 있습니다.

?hour: 시간을 나타내며 0에서 23 사이의 정수일 수 있습니다.

?day: 날짜를 나타내며 1부터 31까지의 정수일 수 있습니다.

?월: 월을 나타내며 1에서 12 사이의 정수일 수 있습니다.

?week: 요일을 나타내며 0에서 7 사이의 정수일 수 있습니다. 여기서 0 또는 7은 일요일을 나타냅니다.

?명령: 실행할 명령은 시스템 명령일 수도 있고 직접 컴파일한 스크립트 파일일 수도 있습니다.

위의 각 배열에는 다음 특수 문자도 사용할 수 있습니다.

? 별표(): 가능한 모든 값을 나타냅니다. 예를 들어 월 배열이 별표인 경우 다른 배열의 차단 조건이 충족된 후 매월 명령 작업이 실행된다는 의미입니다.

?콜론(,): 콜론으로 구분된 값을 사용하여 목록 범위를 지정할 수 있습니다(예: "1,2,5,7,8,9")

?Zhongdong(-): 정수 사이에 중간 막대를 사용하여 정수 범위를 나타낼 수 있습니다. 예를 들어 "2-6"은 "2,3,4,5,6"을 의미합니다

? 슬래시(/): 슬래시를 사용하여 시간 간격 빈도를 지정할 수 있습니다. 예를 들어 "0-23/2"는 2시간마다 실행됨을 의미합니다. 동시에 슬래시를 별표와 함께 사용할 수도 있습니다(예: /10). 분 배열에 사용하면 10분마다 실행된다는 의미입니다.

3、几个crontab事例

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px">0 /3 /usr/<span style="border-width: 0px;border-style: initial;border-color: initial">local</span>/apache2/apachectl restart</span></code>
로그인 후 복사

表示每隔3个小时重启apache服务一次。

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">30</span> <span style="border-width: 0px;border-style: initial;border-color: initial">3</span> <span style="border-width: 0px;border-style: initial;border-color: initial">6</span> <span style="border-width: 0px;border-style: initial;border-color: initial">/webdata/bin/backup.sh</span></span></code>
로그인 후 복사

表示每周六的3点30分执行/webdata/bin/backup.sh脚本的操作。

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">0</span> <span style="border-width: 0px;border-style: initial;border-color: initial">0</span> <span style="border-width: 0px;border-style: initial;border-color: initial">1</span><span style="border-width: 0px;border-style: initial;border-color: initial">,20</span> <span style="border-width: 0px;border-style: initial;border-color: initial">fsck</span> <span style="border-width: 0px;border-style: initial;border-color: initial">/dev/sdb8</span></span></code>
로그인 후 복사

表示每位月的1号和20号检测/dev/sdb8c盘设备。

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px">10 5 /5 * <span style="border-width: 0px;border-style: initial;border-color: initial">echo</span> <span style="border-width: 0px;border-style: initial;border-color: initial">""</span>>/usr/<span style="border-width: 0px;border-style: initial;border-color: initial">local</span>/apache2/<span style="border-width: 0px;border-style: initial;border-color: initial">log</span>/access_log</span></code>
로그인 후 복사

表示每位月的5号、10号、15号、20号、25号、30号的5点10分执行清除apache日志操作。

三、系统级任务调度/etc/crontab

在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

/etc/crontab文件包括下边几行:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">SHELL=/bin/bash</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">PATH=/sbin:/bin:/usr/sbin:/usr/bin</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">MAILTO=root</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">HOME=/</span><br><span style="border-width: 0px;border-style: initial;border-color: initial"># run-parts</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">01</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">root</span> <span style="border-width: 0px;border-style: initial;border-color: initial">run-parts</span> <span style="border-width: 0px;border-style: initial;border-color: initial">/etc/cron.hourly</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">02</span> <span style="border-width: 0px;border-style: initial;border-color: initial">4</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">root</span> <span style="border-width: 0px;border-style: initial;border-color: initial">run-parts</span> <span style="border-width: 0px;border-style: initial;border-color: initial">/etc/cron.daily</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">22</span> <span style="border-width: 0px;border-style: initial;border-color: initial">4</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">0</span> <span style="border-width: 0px;border-style: initial;border-color: initial">root</span> <span style="border-width: 0px;border-style: initial;border-color: initial">run-parts</span> <span style="border-width: 0px;border-style: initial;border-color: initial">/etc/cron.weekly</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">42</span> <span style="border-width: 0px;border-style: initial;border-color: initial">4</span> <span style="border-width: 0px;border-style: initial;border-color: initial">1</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">root</span> <span style="border-width: 0px;border-style: initial;border-color: initial">run-parts</span> <span style="border-width: 0px;border-style: initial;border-color: initial">/etc/cron.monthly</span></span></code>
로그인 후 복사

从前面的示例文件可看出,crontab的任务列表主要由两部份组成:环境变量配置与定时任务配置。可能你们在工作中更多是只用到了任务配置部份。

前四行是拿来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用那个shell,这儿是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子短信发送给root用户,假如MAILTO变量的值为空,则表示不发送任务执行信息给用户linux视频,第四行的HOME变量指定了在执行命令或则脚本时使用的主目录。第六至九行就是crontab执行格式的具体写法。

四、crontab调试解析利器

一般在使用crontab添加任务时,我们会借助自己已有知识编撰定时句子。当须要测试句子是否正确时,还须要在服务器上不断调试,,这些方法太不高效了。有没有一款工具,只要我们给出词句,能够告诉具体执行时间以及对错呢?还真有,下边介绍一款鬼佬开发的crontab在线解析工具。

工具地址:

linux任务计划不生效_linux计划任务格式_linux计划任务整点执行

给出这个工具的截图如下:

linux任务计划不生效_linux计划任务整点执行_linux计划任务格式

好用不好用,你试试就晓得。

五、crontab使用的各类坑

1、环境变量问题

当我们刚使用crontab时,运维老手们通常会告知所有命令尽量都使用绝对路径,以防错误。这是为何?这就和我们下边要谈的环境变量有关了。

首先,获取shell终端环境变量,内容如下:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">[root@SparkWorker1 dylogs]</span><span style="border-width: 0px;border-style: initial;border-color: initial"># env</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">XDG_SESSION_ID</span>=<span style="border-width: 0px;border-style: initial;border-color: initial">1629</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">HOSTNAME</span>=SparkWorker1<br><span style="border-width: 0px;border-style: initial;border-color: initial">TERM</span>=linux<br><span style="border-width: 0px;border-style: initial;border-color: initial">SHELL</span>=/bin/bash<br><span style="border-width: 0px;border-style: initial;border-color: initial">HISTSIZE</span>=<span style="border-width: 0px;border-style: initial;border-color: initial">1000</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">SSH_CLIENT</span>=<span style="border-width: 0px;border-style: initial;border-color: initial">172.16</span>.<span style="border-width: 0px;border-style: initial;border-color: initial">213.132</span> <span style="border-width: 0px;border-style: initial;border-color: initial">50080</span> <span style="border-width: 0px;border-style: initial;border-color: initial">22</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">HADOOP_PREFIX</span>=/opt/hadoop/current<br><span style="border-width: 0px;border-style: initial;border-color: initial">CATALINA_BASE</span>=/opt/hadoop/current/share/hadoop/httpfs/tomcat<br><span style="border-width: 0px;border-style: initial;border-color: initial">SSH_TTY</span>=/dev/pts/<span style="border-width: 0px;border-style: initial;border-color: initial">1</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">QT_GRAPHICSSYSTEM_CHECKED</span>=<span style="border-width: 0px;border-style: initial;border-color: initial">1</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">USER</span>=root<br><span style="border-width: 0px;border-style: initial;border-color: initial">MAIL</span>=/var/spool/mail/root<br><span style="border-width: 0px;border-style: initial;border-color: initial">PATH</span>=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/default/bin:/opt/hadoop/current/bin:/opt/hadoop/current/sbin:/root/bin<br><span style="border-width: 0px;border-style: initial;border-color: initial">PWD</span>=/data/dylogs<br><span style="border-width: 0px;border-style: initial;border-color: initial">LANG</span>=zh_CN.UTF-<span style="border-width: 0px;border-style: initial;border-color: initial">8</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">HOME</span>=/root</span></code>
로그인 후 복사

要获取crontab环境变量信息,可以设置如下计划任务:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">* </span><span style="border-width: 0px;border-style: initial;border-color: initial">* *</span> <span style="border-width: 0px;border-style: initial;border-color: initial">* *</span> /usr/bin/env > /tmp/env.txt</span></code>
로그인 후 복사

等待片刻,env.txt输出内容如下:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">[root@SparkWorker1 dylogs]</span><span style="border-width: 0px;border-style: initial;border-color: initial"># cat /tmp/env.txt</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">XDG_SESSION_ID</span>=<span style="border-width: 0px;border-style: initial;border-color: initial">1729</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">SHELL</span>=/bin/sh<br><span style="border-width: 0px;border-style: initial;border-color: initial">USER</span>=root<br><span style="border-width: 0px;border-style: initial;border-color: initial">PATH</span>=/usr/bin:/bin<br><span style="border-width: 0px;border-style: initial;border-color: initial">PWD</span>=/root<br><span style="border-width: 0px;border-style: initial;border-color: initial">LANG</span>=zh_CN.UTF-<span style="border-width: 0px;border-style: initial;border-color: initial">8</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">SHLVL</span>=<span style="border-width: 0px;border-style: initial;border-color: initial">1</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">HOME</span>=/root<br><span style="border-width: 0px;border-style: initial;border-color: initial">LOGNAME</span>=root<br><span style="border-width: 0px;border-style: initial;border-color: initial">XDG_RUNTIME_DIR</span>=/run/user/<span style="border-width: 0px;border-style: initial;border-color: initial">0</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">_</span>=/usr/bin/env</span></code>
로그인 후 복사

从里面输出结果可知,shell命令行的PATH值为

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px">PATH=<span style="border-width: 0px;border-style: initial;border-color: initial">/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/default/bin:/opt/hadoop/current/bin:/opt/hadoop/current/sbin:/root/bin</span></span></code>
로그인 후 복사

而crontab中的PATH值为:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px">PATH=<span style="border-width: 0px;border-style: initial;border-color: initial">/usr/bin:/bin</span></span></code>
로그인 후 복사

对比crontab环境变量与shell终端环境变量的输出,可以发觉二者的差别很大。你们可能碰到过,在shell命令行执行脚本都没有问题,而放在crontab后却执行异常,或则执行失败,此时,我们就须要考虑是否命令涉及的环境变量在crontab和shell命令行间存在差别。

比如,我们在crontab中执行了如下定时任务:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">20</span> <span style="border-width: 0px;border-style: initial;border-color: initial">16</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">php</span> <span style="border-width: 0px;border-style: initial;border-color: initial">autosave.php</span></span></code>
로그인 후 복사

而假如我们的php是安装在/usr/local/bin/目录下的话,这么前面这个定时任务因为未能找到php命令,会运行失败。

这么,晓得了环境变量问题,可能造成计划任务未能正常执行,如何能够避开这个问题呢,这个交给你们一个终极大招,可以在crontab中加入如下配置,保证你的计划任务执行不会出现环境变量问题:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px">* * * * * <span style="border-width: 0px;border-style: initial;border-color: initial">source</span> /<span style="border-width: 0px;border-style: initial;border-color: initial">$HOME</span>/.bash_profile && <span style="border-width: 0px;border-style: initial;border-color: initial">command</span></span></code>
로그인 후 복사

linux计划任务整点执行_linux计划任务格式_linux任务计划不生效

这个似乎是在执行计划任务命令之前,先加载了用户环境变量信息,由此可保证所有环境变量都可正常加载。

2、定时时间配置误区

时间是crontab的核心,稍稍配置不当,才会出现问题,先看在整点时间设置时可能出现的错误,比如,设定每晚2点执行一次任务,好多同学可能如此写过:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">* </span>2 <span style="border-width: 0px;border-style: initial;border-color: initial">* *</span> * command</span></code>
로그인 후 복사

很显著linux计划任务整点执行linux 删除文件夹,这个时间写法是错误的,当我们看到每晚2点执行一次某任务时,好多人会把重点放到2点,而忽视了执行一次的需求。前面这个定时任务他会在2点开始执行,每分钟执行一次,总共执行60次。

正确的写法应当是这样的:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">0</span> <span style="border-width: 0px;border-style: initial;border-color: initial">2</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">command</span></span></code>
로그인 후 복사

这个才表示每晚2点0分执行command对应的任务。

3、特殊符号%问题

%在crontab中是特殊符号,具体涵义如下:

第一个%表示标准输入的开始,其余%表示换行符,看下边两个反例:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">* </span><span style="border-width: 0px;border-style: initial;border-color: initial">* *</span> <span style="border-width: 0px;border-style: initial;border-color: initial">* *</span> cat >> /tmp/cat.txt 2>&1 % stdin out</span></code>
로그인 후 복사

查看/tmp/cat.txt的内容为:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">stdin</span> out</span></code>
로그인 후 복사

再看下边这个事例:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">*</span> <span style="border-width: 0px;border-style: initial;border-color: initial">cat</span> <span style="border-width: 0px;border-style: initial;border-color: initial">>></span> <span style="border-width: 0px;border-style: initial;border-color: initial">/tmp/cat1.txt</span> <span style="border-width: 0px;border-style: initial;border-color: initial">2</span><span style="border-width: 0px;border-style: initial;border-color: initial">>&1</span> <span style="border-width: 0px;border-style: initial;border-color: initial">%</span> <span style="border-width: 0px;border-style: initial;border-color: initial">stdin</span> <span style="border-width: 0px;border-style: initial;border-color: initial">out</span> <span style="border-width: 0px;border-style: initial;border-color: initial">1</span> <span style="border-width: 0px;border-style: initial;border-color: initial">%</span> <span style="border-width: 0px;border-style: initial;border-color: initial">stdin</span> <span style="border-width: 0px;border-style: initial;border-color: initial">out</span> <span style="border-width: 0px;border-style: initial;border-color: initial">2</span> <span style="border-width: 0px;border-style: initial;border-color: initial">%</span> <span style="border-width: 0px;border-style: initial;border-color: initial">stdin</span> <span style="border-width: 0px;border-style: initial;border-color: initial">out</span> <span style="border-width: 0px;border-style: initial;border-color: initial">3</span></span></code>
로그인 후 복사

查看/tmp/cat1.txt的内容如下:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">stdin</span> out <span style="border-width: 0px;border-style: initial;border-color: initial">1</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">stdin</span> out <span style="border-width: 0px;border-style: initial;border-color: initial">2</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">stdin</span> out <span style="border-width: 0px;border-style: initial;border-color: initial">3</span></span></code>
로그인 후 복사

有输出内容可知,第一个%表示标准输入的开始,其余%表示换行符。

既然"%"是特殊字符,这么在crontab中使用时,就要非常注意,如何使用这种特殊字符呢,很显著,使用转移字符即可linux计划任务整点执行,比如:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">* </span><span style="border-width: 0px;border-style: initial;border-color: initial">* *</span> <span style="border-width: 0px;border-style: initial;border-color: initial">* *</span> cat >> /tmp/cat2.txt 2>&1 % Special character escape %.</span></code>
로그인 후 복사

查看输出/tmp/cat2.txt输出内容如下:

linux任务计划不生效_linux计划任务整点执行_linux计划任务格式

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px">Special character <span style="border-width: 0px;border-style: initial;border-color: initial">escape</span> %.</span></code>
로그인 후 복사

可以看见,执行成功了,并成功避免这个坑了。

4、关于crontab的输出重定向

在crontab执行的计划任务中,有些任务若果不做输出重定向,这么本来会输出到屏幕的信息,会以短信的方式输出到某个文件中,比如,执行下边这个计划任务:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">* </span><span style="border-width: 0px;border-style: initial;border-color: initial">* *</span> <span style="border-width: 0px;border-style: initial;border-color: initial">* *</span> /bin/date</span></code>
로그인 후 복사

这个计划任务是没有做输出重定向的,他的主要用途是输出时间,因为没有配置输出重定向,这么这个时间信息默认将以短信的方式输出到/var/spool/mail/$USER(这个$USER对应的是系统用户,这儿是root用户)文件中,大致内容如下:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">From</span> <span style="border-width: 0px;border-style: initial;border-color: initial">[email protected]</span> <span style="border-width: 0px;border-style: initial;border-color: initial">Fri</span> <span style="border-width: 0px;border-style: initial;border-color: initial">Sep</span> <span style="border-width: 0px;border-style: initial;border-color: initial">21</span> <span style="border-width: 0px;border-style: initial;border-color: initial">12</span><span style="border-width: 0px;border-style: initial;border-color: initial">:58:02</span> <span style="border-width: 0px;border-style: initial;border-color: initial">2022</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">Return-Path:</span> <span style="border-width: 0px;border-style: initial;border-color: initial"></span><br><span style="border-width: 0px;border-style: initial;border-color: initial">X-Original-To:</span> <span style="border-width: 0px;border-style: initial;border-color: initial">root</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">Delivered-To:</span> <span style="border-width: 0px;border-style: initial;border-color: initial">[email protected]</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">Received:</span> <span style="border-width: 0px;border-style: initial;border-color: initial">by</span> <span style="border-width: 0px;border-style: initial;border-color: initial">SparkWorker1.localdomain</span> <span style="border-width: 0px;border-style: initial;border-color: initial">(Postfix,</span> <span style="border-width: 0px;border-style: initial;border-color: initial">from</span> <span style="border-width: 0px;border-style: initial;border-color: initial">userid</span> <span style="border-width: 0px;border-style: initial;border-color: initial">0</span><span style="border-width: 0px;border-style: initial;border-color: initial">)</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">id</span> <span style="border-width: 0px;border-style: initial;border-color: initial">F2745192AE;</span> <span style="border-width: 0px;border-style: initial;border-color: initial">Fri,</span> <span style="border-width: 0px;border-style: initial;border-color: initial">21</span> <span style="border-width: 0px;border-style: initial;border-color: initial">Sep</span> <span style="border-width: 0px;border-style: initial;border-color: initial">2022</span> <span style="border-width: 0px;border-style: initial;border-color: initial">12</span><span style="border-width: 0px;border-style: initial;border-color: initial">:58:01</span> <span style="border-width: 0px;border-style: initial;border-color: initial">+0800</span> <span style="border-width: 0px;border-style: initial;border-color: initial">(CST)</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">From:</span> <span style="border-width: 0px;border-style: initial;border-color: initial">"(Cron Daemon)"</span> <span style="border-width: 0px;border-style: initial;border-color: initial"></span><br><span style="border-width: 0px;border-style: initial;border-color: initial">To:</span> <span style="border-width: 0px;border-style: initial;border-color: initial">[email protected]</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">Subject:</span> <span style="border-width: 0px;border-style: initial;border-color: initial">Cron</span> <span style="border-width: 0px;border-style: initial;border-color: initial"></span> <span style="border-width: 0px;border-style: initial;border-color: initial">/bin/date</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">Content-Type:</span> <span style="border-width: 0px;border-style: initial;border-color: initial">text/plain;</span> <span style="border-width: 0px;border-style: initial;border-color: initial">charset=UTF-8</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">Auto-Submitted:</span> <span style="border-width: 0px;border-style: initial;border-color: initial">auto-generated</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">Precedence:</span> <span style="border-width: 0px;border-style: initial;border-color: initial">bulk</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">X-Cron-Env:</span> <span style="border-width: 0px;border-style: initial;border-color: initial"></span><br><span style="border-width: 0px;border-style: initial;border-color: initial">X-Cron-Env:</span> <span style="border-width: 0px;border-style: initial;border-color: initial"></span><br><span style="border-width: 0px;border-style: initial;border-color: initial">X-Cron-Env:</span> <span style="border-width: 0px;border-style: initial;border-color: initial"></span><br><span style="border-width: 0px;border-style: initial;border-color: initial">X-Cron-Env:</span> <span style="border-width: 0px;border-style: initial;border-color: initial"></span><br><span style="border-width: 0px;border-style: initial;border-color: initial">X-Cron-Env:</span> <span style="border-width: 0px;border-style: initial;border-color: initial"></span><br><span style="border-width: 0px;border-style: initial;border-color: initial">X-Cron-Env:</span> <span style="border-width: 0px;border-style: initial;border-color: initial"></span><br><span style="border-width: 0px;border-style: initial;border-color: initial">X-Cron-Env:</span> <span style="border-width: 0px;border-style: initial;border-color: initial"></span><br><span style="border-width: 0px;border-style: initial;border-color: initial">X-Cron-Env:</span> <span style="border-width: 0px;border-style: initial;border-color: initial"></span><br><span style="border-width: 0px;border-style: initial;border-color: initial">Message-Id:</span> <span style="border-width: 0px;border-style: initial;border-color: initial"></span><br><span style="border-width: 0px;border-style: initial;border-color: initial">Date:</span> <span style="border-width: 0px;border-style: initial;border-color: initial">Fri,</span> <span style="border-width: 0px;border-style: initial;border-color: initial">21</span> <span style="border-width: 0px;border-style: initial;border-color: initial">Sep</span> <span style="border-width: 0px;border-style: initial;border-color: initial">2022</span> <span style="border-width: 0px;border-style: initial;border-color: initial">12</span><span style="border-width: 0px;border-style: initial;border-color: initial">:58:01</span> <span style="border-width: 0px;border-style: initial;border-color: initial">+0800</span> <span style="border-width: 0px;border-style: initial;border-color: initial">(CST)</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">2022</span><span style="border-width: 0px;border-style: initial;border-color: initial">年</span> <span style="border-width: 0px;border-style: initial;border-color: initial">09</span><span style="border-width: 0px;border-style: initial;border-color: initial">月</span> <span style="border-width: 0px;border-style: initial;border-color: initial">21</span><span style="border-width: 0px;border-style: initial;border-color: initial">日</span> <span style="border-width: 0px;border-style: initial;border-color: initial">星期五</span> <span style="border-width: 0px;border-style: initial;border-color: initial">12</span><span style="border-width: 0px;border-style: initial;border-color: initial">:58:01</span> <span style="border-width: 0px;border-style: initial;border-color: initial">CST</span></span></code>
로그인 후 복사

由此可见,输出内容还是好多的,如遇见任务有大量输出的话,会占用大量c盘空间,其实,这个电邮输出最好关掉,如何关掉呢,只需设置MAILTO环境变量为空即可,里面的计划任务,可做如下更改:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px">MAILTO=""<br><span style="border-width: 0px;border-style: initial;border-color: initial">* </span><span style="border-width: 0px;border-style: initial;border-color: initial">* *</span> <span style="border-width: 0px;border-style: initial;border-color: initial">* *</span> /bin/date</span></code>
로그인 후 복사

这样,就不会发短信信息到/var/spool/mail/$USER下了,而且问题并没有彻底解决,关掉mail功能后,输出内容将继续写入到/var/spool/clientmqueue中,常年下去,可能占满分区的inode资源,造成任务未能执行。

为了防止这种问题发生,建议任务都加上输出重定向,比如,可以在crontab文件中设置如下方式,忽视日志输出:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">0</span> *<span style="border-width: 0px;border-style: initial;border-color: initial">/3 * * * /u</span>sr/local/apache2/apachectl restart ><span style="border-width: 0px;border-style: initial;border-color: initial">/dev/</span><span style="border-width: 0px;border-style: initial;border-color: initial">null</span> <span style="border-width: 0px;border-style: initial;border-color: initial">2</span>>&<span style="border-width: 0px;border-style: initial;border-color: initial">1</span></span></code>
로그인 후 복사

其中,“/dev/null2>&1”表示先将标准输出重定向到/dev/null,之后将标准错误重定向到标准输出,因为标准输出早已重定向到了/dev/null,因而标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

5、调试crontab问题的通常思路

要解决crontab相关异常问题,可根据如下思路进行调试:

(1)、通过/var/log/cron日志确认任务是否执行

(2)、如未执行则剖析定时句子,是否是环境变量问题、特殊字符问题、时间配置问题、权限问题等。

(3)、确认crond服务开启,假如定时句子也正确,检测crond服务是否开启。

Systemd形式(centos7及以上)

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px">[root@SparkWorker1 spool]<span style="border-width: 0px;border-style: initial;border-color: initial"># systemctl status crond.service</span></span></code>
로그인 후 복사

SysVinit形式(centos7以下)

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px">[root@SparkWorker1 spool]<span style="border-width: 0px;border-style: initial;border-color: initial"># service crond status</span></span></code>
로그인 후 복사

(4)确认定时任务中命令是否执行成功

这个问题可通过输出获取错误信息进行调试,技巧就是借助重定向获取输出,之后进行剖析。举例如下:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px"><span style="border-width: 0px;border-style: initial;border-color: initial">* </span><span style="border-width: 0px;border-style: initial;border-color: initial">* *</span> <span style="border-width: 0px;border-style: initial;border-color: initial">* *</span> python /usr/local/dyserver/dypos.py >> /tmp/dypos.log 2>&1</span></code>
로그인 후 복사

通过加上“/tmp/dypos.log2>&1”,就可以很快定位问题,由于这个dypos.py脚本在执行的时侯会把错误信息都输出到dypos.log中,接着查看dypos.log文件,问题一目了然:

<code style="font-family: inherit;font-size: 14px;border-width: 0px;border-style: initial;border-color: initial;line-height: 24px"><span style="font-size: 15px">[root@SparkWorker1 spool]<span style="border-width: 0px;border-style: initial;border-color: initial"># cat /tmp/dypos.log</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">/bin/sh: python: 未找到命令</span><br><span style="border-width: 0px;border-style: initial;border-color: initial">/bin/sh: python: 未找到命令</span></span></code>
로그인 후 복사

显示python命令没有找到,很显著的就可以确定是环境变量的问题。这些方法定位问题十分有效。

良许花了一个半月的时间研制了一门Linux命令课程,欢迎订购学习!

课程特色:

详尽总结150个高频使用命令,学完可应对工作中95%命令需求;

答疑群提供无限次答疑服务,答疑群气氛挺好;

总时长超10小时,抗衡大课时长。

长按下方卡片订购

强烈推荐一位腾讯大鳄录制的Shell实战案例课程(已获授权):

大鳄在腾讯工作6年,在大厂工作十几年,经验丰富;

大鳄依据自己在大厂工作经验总结了100个案例,超级实用!

学完这100个案例,肯定对自己的Shell编程有很大的提高;

答疑群提供无限次答疑服务,答疑群气氛挺好。

长按下方卡片订购

linux任务计划不生效_linux计划任务整点执行_linux计划任务格式

위 내용은 Linux에서 crontab의 문제점 및 문제 해결 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

인터넷은 Linux에서 실행됩니까? 인터넷은 Linux에서 실행됩니까? Apr 14, 2025 am 12:03 AM

인터넷은 단일 운영 체제에 의존하지 않지만 Linux는 이에 중요한 역할을합니다. Linux는 서버 및 네트워크 장치에서 널리 사용되며 안정성, 보안 및 확장 성으로 인기가 있습니다.

Linux에서 Nginx를 시작하는 방법 Linux에서 Nginx를 시작하는 방법 Apr 14, 2025 pm 12:51 PM

Linux에서 Nginx를 시작하는 단계 : Nginx가 설치되어 있는지 확인하십시오. systemctl start nginx를 사용하여 nginx 서비스를 시작하십시오. SystemCTL을 사용하여 NGINX를 사용하여 시스템 시작시 NGINX의 자동 시작을 활성화하십시오. SystemCTL 상태 nginx를 사용하여 시작이 성공했는지 확인하십시오. 기본 환영 페이지를 보려면 웹 브라우저의 http : // localhost를 방문하십시오.

nginx 서버를 시작하는 방법 nginx 서버를 시작하는 방법 Apr 14, 2025 pm 12:27 PM

Nginx 서버를 시작하려면 다른 운영 체제에 따라 다른 단계가 필요합니다. Linux/Unix System : Nginx 패키지 설치 (예 : APT-Get 또는 Yum 사용). SystemCTL을 사용하여 nginx 서비스를 시작하십시오 (예 : Sudo SystemCtl start nginx). Windows 시스템 : Windows 바이너리 파일을 다운로드하여 설치합니다. nginx.exe 실행 파일을 사용하여 nginx를 시작하십시오 (예 : nginx.exe -c conf \ nginx.conf). 어떤 운영 체제를 사용하든 서버 IP에 액세스 할 수 있습니다.

nginx가 시작되었는지 확인하는 방법 nginx가 시작되었는지 확인하는 방법 Apr 14, 2025 pm 01:03 PM

nginx가 시작되었는지 확인하는 방법 : 1. 명령 줄을 사용하십시오 : SystemCTL 상태 nginx (linux/unix), netstat -ano | Findstr 80 (Windows); 2. 포트 80이 열려 있는지 확인하십시오. 3. 시스템 로그에서 nginx 시작 메시지를 확인하십시오. 4. Nagios, Zabbix 및 Icinga와 같은 타사 도구를 사용하십시오.

Nginx403을 해결하는 방법 Nginx403을 해결하는 방법 Apr 14, 2025 am 10:33 AM

Nginx 403 금지 된 오류를 수정하는 방법은 무엇입니까? 파일 또는 디렉토리 권한을 확인합니다. 2. 확인 파일을 확인하십시오. 3. nginx 구성 파일 확인; 4. nginx를 다시 시작하십시오. 다른 가능한 원인으로는 방화벽 규칙, Selinux 설정 또는 응용 프로그램 문제가 있습니다.

nginx403 오류를 해결하는 방법 nginx403 오류를 해결하는 방법 Apr 14, 2025 pm 12:54 PM

서버는 요청 된 리소스에 액세스 할 수있는 권한이 없으므로 Nginx 403 오류가 발생합니다. 솔루션에는 다음이 포함됩니다. 파일 권한 확인 권한을 확인하십시오. .htaccess 구성을 확인하십시오. nginx 구성을 확인하십시오. Selinux 권한을 구성하십시오. 방화벽 규칙을 확인하십시오. 브라우저 문제, 서버 장애 또는 기타 가능한 오류와 같은 다른 원인을 해결하십시오.

Nginx 서버 설치 및 빠른 구성 안내서 Nginx 서버 설치 및 빠른 구성 안내서 Apr 13, 2025 pm 10:18 PM

이 기사에서는 Nginx의 구성 및 구성 방법을 소개합니다. 1. nginx 설치 : Centos에서 sudoyumininstallnginx를 사용하고 Ubuntu에서 sudoapt-getinstallnginx를 사용하고 설치 후 sudosystemctlstartnginx로 시작하십시오. 2. 기본 구성 : /etc/nginx/nginx.conf 파일을 수정하고 주로 서버 블록에서 청취 (포트) 및 루트 (사이트 루 디렉토리) 지침을 수정하고 수정 후 sudosystemctlrestartnginx를 사용하여 다시 시작하고 적용하십시오. 3. 가상 호스트 구성 : nginx.co에서

nginx가 시작되었는지 확인하는 방법은 무엇입니까? nginx가 시작되었는지 확인하는 방법은 무엇입니까? Apr 14, 2025 pm 12:48 PM

Linux에서는 다음 명령을 사용하여 nginx가 시작되었는지 확인하십시오. SystemCTL 상태 Nginx 판사 명령 출력에 따라 : "active : running"이 표시되면 Nginx가 시작됩니다. "Active : 비활성 (죽음)"이 표시되면 Nginx가 중지됩니다.

See all articles