Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Gründe, warum Linux Crond nicht ausgeführt wird

Gründe, warum Linux Crond nicht ausgeführt wird

小云云
小云云Original
2018-03-20 14:04:552854Durchsuche

Um die CPU-, Speicher- und Lastauslastung des Linux-Systems regelmäßig zu überwachen, habe ich ein Linux-Shell-Skript geschrieben, das regelmäßig E-Mail-Benachrichtigungen sendet. Als ich crond jedoch aufforderte, das Skript zum Senden von E-Mail-Benachrichtigungen regelmäßig auszuführen, stieß ich auf ein Problem. Nachdem ich das Ausführungsskript zu crontab -e hinzugefügt hatte, stellte ich fest, dass das Skript nicht ausgeführt wurde.

Es ist jedoch normal, den Shell-Skriptbefehl (./mimvp-email.sh) manuell auszuführen, da durch die manuelle Ausführung des Skripts standardmäßig die Linux-Umgebungsvariablen abgerufen werden können, diese jedoch nicht über geplante Aufgaben abgerufen werden können erfolgt durch Crontab-Umgebungsvariablen.

Nach der Analyse der Gründe sind die Hauptgründe, warum Crond nicht ausgeführt wird, folgende:

1 Der Crond-Dienst wurde nicht gestartet

ps -ef | grep -v grep | grep crond         // 查看crond服务是否运行
service crond start           //关闭服务
service crond stop           //关闭服务
service crond restart       //重启服务
service crond reload       //重新载入配置

2 führt keine Crond-Berechtigungen aus

vim /etc/cron.deny-Datei wird verwendet, um zu steuern, welche Benutzer die Funktionen des Crond-Dienstes nicht ausführen können.

Sie können sich selbst aus der Datei löschen oder Root kontaktieren

3. Crontab stellt die Umgebungsvariablen des ausführenden Benutzers nicht bereit

Lösung: Fügen Sie dem Skript Folgendes hinzu Eine Zeile:

./etc/profile
script und crond Es gibt zwei Aspekte des Pfads im Befehl, zum Beispiel:

*/10 * * * * sh /root/script/mysql_files_monitor.sh &

5 Wenn der Das obige Problem löst das Problem nicht. Sie können es erneut versuchen. Finden Sie das Problem:

1) Überprüfen Sie die E-Mail. Während dieses Vorgangs sollte der Benutzer eine E-Mail wie diese erhalten:

vim /var/spool/mail/root

Sie haben E-Mails in /var/spool/mail/root

Schauen Sie sich dort den Crond-Inhalt an

Die Datei ist zu groß zum Öffnen, Sie können die letzten 1000 Zeilen abfangen

tail -n 1000 /var/spool/mail/root > Fügen Sie dem Skript eine Ausgabe zum Debuggen hinzu

Sie können

echo $PATH > /tmp/test.log

im crontab-Skript hinzufügen und mit echo $ vergleichen PATH

6 Wenn beim Ausführen des Skripts im Terminal zu viele Crond-Prozesse vorhanden sind, beenden Sie sie alle und starten Sie den Crond-Dienst neu

#!/bin/bash

für i in $ (ps -elf | grep -v grep | grep crond | awk -F " " ' {print $4}' ); do

kill -9 $i

done

Verwenden Sie root, um a auszuführen Neustart, und das Problem ist gelöst:


service crond restart

7. crond verhindert wiederholte Ausführung, bevor das Skript innerhalb des Zyklus abgeschlossen ist

Persönliche Erfahrung: flock -xn my .lock cmd

my.lock ist eine Datei, es kann eine beliebige Datei sein und Sie können eine neue leere Datei erstellen

Wenn flock die Sperre erhält, führt es den nachfolgenden cmd

-Testvorgang aus :

$1: flock -xn my.lock sleep 20
$2: flock -xn my.lock ls

Nur ​​wenn 1 zurückkehrt, wird das ls von 2 erfolgreich sein

Wenn ein Skript 30 Minuten lang ausgeführt werden muss, können Sie das Skriptintervall in Crontab auf mindestens eine Stunde einstellen, um Konflikte zu vermeiden. Die schlimmste Situation besteht darin, dass das Skript während des Ausführungszyklus möglicherweise nicht abgeschlossen wird und dann die Ausführung des zweiten Skripts erneut beginnt. Wie kann ich sicherstellen, dass nur eine Instanz des Skripts ausgeführt wird? Eine nützliche Methode ist die Verwendung von lockf (lockf unter FreeBSD 8.1, flock unter CentOS 5.5), um vor der Ausführung des Skripts zu prüfen, ob eine Dateisperre erreicht werden kann, um Konflikte bei der Ausführung des Skripts zu vermeiden.


lockf-Parameter lauten wie folgt

-k: Warten Sie, bis die Dateisperre erhalten ist.

-s: still, sendet keine Informationen, auch wenn die Dateisperre nicht erreicht werden kann.

-t Sekunden: Stellen Sie das Timeout auf Sekunden ein. Wenn die Zeit überschritten wird, wird automatisch aufgegeben.

Bevor Sie die folgende geplante Crontab-Aufgabe ausführen, müssen Sie die temporäre Datei „create.lock“ erhalten. Der Inhalt der geplanten Crontab-Aufgabe lautet wie folgt:

1 */10 * * * * (lockf -s -t 0 /tmp/create.lock /usr/bin/python /home/project/cron/create_tab.py >> /home/project/logs/create.log 2>&1)

Wenn die erste Instanz nicht innerhalb von 10 Minuten ausgeführt wird, wird die zweite Instanz nicht ausgeführt. Früher habe ich dieses Problem durch Shell-Skripte gelöst, z. B. durch die Verwendung einer while...do-Schleife und deren anschließende Ausführung im Hintergrund. Später stellte ich jedoch fest, dass es einfacher ist, die Flock- oder Lockf-Methode zu verwenden.

Anbei finden Sie die Verwendung von flock unter Linux:

flock (util-linux 2.13-pre7)
Usage: flock [-sxun][-w #] fd#
       flock [-sxon][-w #] file [-c] command...
  -s  --shared     Get a shared lock 
#共享锁,在定向为某文件的FD上设置共享锁而未释放锁的时间内,其他进程试图在定向为此文件的FD上设置独占锁的请求失败,而其他进程试图在定向为此文件的FD上设置共享锁的请求会成功
  -x  --exclusive  Get an exclusive lock 
#独占或排他锁,在定向为某文件的FD上设置独占锁而未释放锁的时间内,其他进程试图在定向为此文件的FD上设置共享锁或独占锁都会失败。只要未设置-s参数,此参数默认被设置
  -u  --unlock     Remove a lock 
#手动解锁,一般情况不必须,当FD关闭时,系统会自动解锁,此参数用于脚本命令一部分需要异步执行,一部分可以同步执行的情况
  -n  --nonblock   Fail rather than wait 
#为非阻塞模式,当试图设置锁失败,采用非阻塞模式,直接返回1,
  -w  --timeout    Wait for a limited amount of time
#设置阻塞超时,当超过设置的秒数,就跳出阻塞,返回1
  -o  --close      Close file descriptor before running command
  -c  --command    Run a single command string through the shell 执行其后的comand
  -h  --help       Display this text
  -V  --version    Display version
举个例子执行如下脚本:

每天23:30的时候执行一个脚本,但是执行前必须要获得排他文件锁,否则无法执行命令

1 30 23 * * * flock -xn /tmp/test.lock -c '/usr/local/php test.php'

8、; 和 && 区别

“;” 和 “&&”是有区别的

“;”:不管cmd1执行的结果如何,都执行cmd2

“&&”:只有cmd1执行返回的结果是成功的,才执行cmd2

cmd1 && cmd2; cmd3

- cmd1 is executed, if it succeeds, then execute cmd2. and then cmd3 (regardless of cmd2 success or not)

- cmd1 is executed, if it fails, then cmd3 (cmd2 won't be executed)

9、如果遇到shell语法错误

Syntax error: "(" unexpected

解决方法:

需指定shell解释器命令:SHELL=/bin/bash(请参见上面 crontab编辑示例 SHELL=/bin/bash)

或者参见: LINUX - BASH Syntax Error

如果遇到路径错误

在 /var/spool/crontab/yanggang 中,添加了如下命令,在日志文件 /var/spool/mail/yanggang 中提示找不到 xxx.sh 路径

30 * * * *  /home/barry/top800/top10/top10_fruits/top10_all.sh

30 * * * * bash /home/barry/top800/top10/top10_fruits/top10_all.sh

这是因为你在crontab中使用了绝对路径执行脚本 top10_all.sh,因此在脚本 top10_all.sh 中引用的其它脚本也都需要使用绝对路径,才能被crontab找到并执行。

那么该如何避免绝对路径呢,推荐采用如下格式:

30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh(推荐用此方式)

先进入该目录,然后在执行脚本;否则,执行脚本中的其它脚本都需要加绝对路径

参考推荐:

CentOS 7.2上 crontab 计划任务

linux定时运行命令脚本——crontab

CentOS crontab 定时任务不执行的解决

WordPress定时任务(wp-cron.php)造成主机CPU超标解决办法。

Das obige ist der detaillierte Inhalt vonGründe, warum Linux Crond nicht ausgeführt wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn