我为 crontab 输入了一个命令,但似乎什么也没发生。
#vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# …Run Code Online (Sandbox Code Playgroud) 根据我的理解,您可以通过编辑来编写您的 crons
crontab -e
Run Code Online (Sandbox Code Playgroud)
我发现有几个来源在 cron 作业中引用了 bash 脚本,而不是为行编写作业行。
您可以使用 bash 脚本将许多任务合并为一个 cron 作业的唯一好处是什么?
新手的附加问题:编辑 crontab -e 指的是一个文件正确吗?我注意到,如果我打开 crontab -e 并关闭而不进行编辑,当我再次打开文件时,会有不同的数字扩展名,例如:
"/tmp/crontab.XXXXk1DEaM" 0L, 0C
Run Code Online (Sandbox Code Playgroud)
我虽然 crontab 存储在 /var/spool/cron 或 /etc/crontab 中?
为什么它将 cron 存储在 tmp 文件夹中?
问候我是 cron 的新手。是否可以每小时随机运行一次自动 cron 作业?
语法应该每天都不同,例如:
34,57,44,30,37,31,38,30,44,35,36,56,46,55,54,40,45,44,42,35,50,59,48,34,52,* * * * *
Run Code Online (Sandbox Code Playgroud)
据我所知,上面的代码将在 0:34、01:57、02:44.... 到 23:52 发送 cron 作业。我目前正在用 PHP 生成语法,但我不确定如何将它发送到 cron 命令或者它是否安全。请告知如何实现这一点。
-rw-r--r--. 1 myusername developers 169 May 17 09:01 build.sh
Run Code Online (Sandbox Code Playgroud)
为什么我可以从命令行执行 build.sh 脚本,如果它没有执行权限,但是当 crontab 尝试执行它时,它失败了?
我的根 crontab 中列出了一个脚本
07 9 * * * /opt/HLRSDATA_2010_OCT/HLRS_Scheduler_sp.sh > /opt/HLRSDATA_2010_OCT/logs/HLRTKJob.log
Run Code Online (Sandbox Code Playgroud)
该脚本包含以下内容
#!/bin/bash
echo HLRSData Scheduler
cd /opt/HLRSDATA_2010_OCT
/usr/bin/java -Xms32m -Xmx1024m -cp ".:HLRSDATA_Premium.jar:lib/commons-net-1.4.1.jar:lib/jakarta-oro-2.0.8.jar:lib/mysql-connector-java-3.1.12-bin.jar:lib/x
ercesImpl.jar" mx.com.txm.hlrsdata.scheduler.HLRS_Scheduler
/opt/HLRSDATA_2010_OCT/HLRS_Scheduler_Reports_sp.sh
/opt/HLRSDATA_2010_OCT/HLRS_Scheduler_Reports_Redundant_sp.sh
/opt/HLRSDATA_2010_OCT/HLRS_Delete_Data_sp.sh
/opt/HLRSDATA_2010_OCT/HLRS_Delete_Data_Redundant_sp.sh
/opt/HLRSDATA_2010_OCT/HLRS_Delete_Files.sh
Run Code Online (Sandbox Code Playgroud)
脚本没有运行,我检查了 /var/log/cron ,甚至没有任何迹象表明它至少试图运行某些东西。
日志:
Oct 18 08:47:19 isvahlrtk01 crontab[46449]: (root) END EDIT (root)
Oct 18 08:47:22 isvahlrtk01 crontab[46455]: (root) BEGIN EDIT (root)
Oct 18 08:47:35 isvahlrtk01 crontab[46455]: (root) REPLACE (root)
Oct 18 08:47:35 isvahlrtk01 crontab[46455]: (root) END EDIT (root)
Oct 18 08:57:18 isvahlrtk01 crontab[46540]: (root) LIST (root)
Oct 18 09:00:18 …Run Code Online (Sandbox Code Playgroud) 我的 crontab 看起来像这样;
1 * * * * /var/www/cron/site1.sh > /dev/null 2>&1
0 * * * * /var/www/cron/site2.sh > /dev/null 2>&1
3 * * * * /var/www/cron/site3.sh > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
这很好用,让我将所有讨厌的小脚本调用放在一个地方,而不是让 crontab 比现在更难阅读。
但是,当 site2.sh需要一个脚本每天运行一次,另一个脚本每周运行一次,另一个脚本每 5 分钟运行一次。当然,随着新脚本的添加时间不同,情况会变得更糟。
有没有更好的办法?
编辑
更好我的意思是让它更易于管理,拥有一个大的 crontab 是不可管理的,但也不是到处都有脚本。
不一定是 GUI。
为什么这个 cron 作业会随着时间的推移重复执行,我该怎么做才能阻止它?
我有一个应该在每天早上 4 点运行的 cron 工作。它击中了一个 php 脚本,该脚本执行一些日常数据分析,并在正常情况下运行一次(大约需要 2-3 分钟才能完成)并退出。它一直在工作,但最近它在服务器崩溃的时候运行得很糟糕。我调查并发现了以下内容。crontab 条目如下所示:
* 4 * * * /usr/bin/wget -q -O /dev/null 'http://123.456.78.90/index/thing?param=1'
Run Code Online (Sandbox Code Playgroud)
在我的日志文件中,我看到:
123.456.78.90 - - [28/Nov/2012:04:00:01 -0800] "GET /index/thing?param=1 HTTP/1.0" 200 4181 "-" "Wget/1.12 (linux-gnu)"
123.456.78.90 - - [28/Nov/2012:04:01:01 -0800] "GET /index/thing?param=1 HTTP/1.0" 200 4181 "-" "Wget/1.12 (linux-gnu)"
123.456.78.90 - - [28/Nov/2012:04:02:01 -0800] "GET /index/thing?param=1 HTTP/1.0" 200 4181 "-" "Wget/1.12 (linux-gnu)"
// and then later it ends with (note that it isn't trying every minute now)
123.456.78.90 - …Run Code Online (Sandbox Code Playgroud) 我希望在这些非常特定的时间开展工作。
这甚至可以用一种表达方式完成吗?
我正在运行默认 Debian linux 的 Amazon ec2 实例上运行一个网站。我设置了一个 cronjob 来复制站点文件,获取数据库印记,然后将它们压缩。我想将文件存档保存在与 bash 脚本本身相同的目录中,该目录位于 /var/www/[a new directory]/[a new directory]/[etc]/ 中的深处。我创建了一个只能读取和转储数据库,但不能写入的 mysql 用户。
脚本如下
#/bin/bash
CURRPATH=$(pwd)
SITEPATH="/var/www/html"
MYSQLUSER="user"
MYSQLPASS="password"
MYSQLDB="database"
CURRDATE=$(date +"%Y-%m-%d__%T_%p")
DATETAG="Backup_$CURRDATE"
TEMPDIR="$CURRPATH/$DATETAG"
ARCHIVENAME="$DATETAG.zip"
# I first copy the files so I can stick a database imprint in the same directory
cp -r "$SITEPATH/" "$CURRPATH/"
mv "$CURRPATH/html" "$TEMPDIR"
mysqldump -u "$MYSQLUSER" -p"$MYSQLPASS" "$MYSQLDB" > "$TEMPDIR/BackupDB_$CURRDATE.sql"
cd $CURRPATH
zip -r "$ARCHIVENAME" "$DATETAG"
rm -rf "$TEMPDIR"
Run Code Online (Sandbox Code Playgroud)
我用 crontab 设置了这个,它完美地工作,除了一个问题 - 存档最终在 ~/root 文件夹中(我用 root 用户设置了 …
我在 cron.d 中有一个条目:
31 17 * * * root /home/some_user/.bash_profile; /home/some_user/bin/some_script
Run Code Online (Sandbox Code Playgroud)
配置文件设置了一个特定的路径,我在配置文件中回显当前路径以确保其正确。但是,当脚本执行时,其中的命令失败,因为它不在 PATH 中,并且当我在脚本中显示当前 PATH 时 - 它不是配置文件中设置的。
为什么配置文件中设置的 PATH 在脚本的执行中不存在?
cron ×10
bash ×4
linux ×3
php ×2
amazon-ec2 ×1
apache-2.2 ×1
automation ×1
debian ×1
fedora ×1
permissions ×1
rhel6 ×1
wget ×1