crontab是否有不使用编辑器(crontab -e)创建cron作业的参数?如果是,从Bash脚本创建cron作业的代码是什么?


当前回答

关于crontab的使用已经有很多不错的答案,但是没有提到更简单的方法,比如使用cron。

使用cron将利用位于/etc/crontab、/etc/cron.目录的系统文件和目录Daily、weekly、hour或/etc/cron.d/:

cat > /etc/cron.d/<job> << EOF
SHELL=/bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin 
MAILTO=root HOME=/  
01 * * * * <user> <command>
EOF

在上面的例子中,我们在/etc/cron.目录中创建了一个文件D /为命令成功执行提供了环境变量,并为命令和命令本身提供了用户。该文件不应该是可执行的,名称应该只包含字母-数字和连字符(详细信息如下)。

为了给出一个彻底的答案,让我们看看crontab和cron/crond之间的区别:

crontab -- maintain tables for driving cron for individual users

对于那些希望在系统上的用户上下文中运行作业的人来说,使用crontab可能非常有意义。

cron -- daemon to execute scheduled commands

对于那些使用配置管理或希望为其他用户管理作业的人,在这种情况下,我们应该使用cron。

从手册中摘录了一些例子,告诉你应该做什么,不应该做什么:

/etc/crontab and the files in /etc/cron.d must be owned by root, and must not be group- or other-writable. In contrast to the spool area, the files under /etc/cron.d or the files under /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly and /etc/cron.monthly may also be symlinks, provided that both the symlink and the file it points to are owned by root. The files under /etc/cron.d do not need to be executable, while the files under /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly and /etc/cron.monthly do, as they are run by run-parts (see run-parts(8) for more information). Source: http://manpages.ubuntu.com/manpages/trusty/man8/cron.8.html

从系统的角度来看,以这种方式管理cron更容易,也更可扩展,但并不总是最好的解决方案。

其他回答

我喜欢的解决方案是这样的:

(crontab -l | grep . ; echo -e "0 4 * * * myscript\n") | crontab -

这将确保您正确地处理底部的空白新行。为了避免crontab的问题,通常应该在crontab文件结束时添加一个空白的新行。上面的脚本确保它首先删除带有“grep .”部分的所有空行,然后在脚本末尾添加带有“\n”的新空行。如果现有crontab文件以空行结束,这还将防止在新命令上方出现空行。

很有可能您正在将此工作自动化,并且您不希望单个工作添加两次。 在这种情况下使用:

__cron="1 2 3 4 5 /root/bin/backup.sh"
cat <(crontab -l) |grep -v "${__cron}" <(echo "${__cron}")

这只在使用BASH时有效。我不知道正确的DASH (sh)语法。

更新:如果用户还没有crontab,这将不起作用。更可靠的方法是:

(crontab -l ; echo "1 2 3 4 5 /root/bin/backup.sh") | sort - | uniq - | crontab - 

或者,如果你的发行版支持它,你也可以使用一个单独的文件:

echo "1 2 3 4 5 /root/bin/backup.sh" |sudo tee /etc/crond.d/backup

在另一个SO问题中找到的。

编辑(固定覆盖):

cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -

这个较短的表不需要临时文件,它不受多次插入的影响,并且允许您更改现有条目的计划。

假设你有这些:

croncmd="/home/me/myfunction myargs > /home/me/myfunction.log 2>&1"
cronjob="0 */15 * * * $croncmd"

将它添加到crontab,不重复:

( crontab -l | grep -v -F "$croncmd" ; echo "$cronjob" ) | crontab -

将它从crontab中删除,不管它当前的日程安排是什么:

( crontab -l | grep -v -F "$croncmd" ) | crontab -

注:

grep -F逐字匹配字符串,因为我们不想将其解释为正则表达式 我们也忽略了时间调度,只寻找命令。这种方式;可以在没有向crontab添加新行风险的情况下更改时间表

一个只在没有找到所需字符串时才编辑crontab的变体:

CMD="/sbin/modprobe fcpci"
JOB="@reboot $CMD"
TMPC="mycron"
grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")