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中没有修改cron文件的选项。

您必须:获取当前的cron文件(crontab -l > newfile),更改它并将新文件放置到位(crontab newfile)。

如果你熟悉perl,你可以使用Config::Crontab这个模块。

LLP安德里亚

所以,在Debian、Ubuntu和许多类似的基于Debian的发行版中……

有一个cron任务连接机制,它接受一个配置文件,将它们捆绑起来,并将它们添加到运行中的cron服务中。

你可以把一个文件放在/etc/cron.目录下D /somefilename,其中somefilename是你想要的任何东西。

sudo echo "0,15,30,45 * * * * ntpdate -u time.nist.gov" >> /etc/cron.d/vmclocksync

让我们来分解一下:

Sudo -因为您需要提升权限来更改/etc目录下的cron配置

Echo -在STD输出时创建输出的工具。printf,猫……也会起作用

-在你的字符串开头使用双引号,你是专业的

0,15,30,45 * * * * -标准的cron运行调度,每15分钟运行一次

ntpdate -u time.nist.gov -我想要运行的实际命令

-因为我的第一个双引号需要一个伙伴来关闭正在输出的行

>> -双重定向追加而不是覆盖*

/etc/cron.d/vmclocksync - vmclocksync是我选择的文件名,它在/etc/cron.d/


* if we used the > redirect, we could guarantee we only had one task entry. But, we would be at risk of blowing away any other rules in an existing file. You can decide for yourself if possible destruction with > is right or possible duplicates with >> are for you. Alternatively, you could do something convoluted or involved to check if the file name exists, if there is anything in it, and whether you are adding any kind of duplicate-- but, I have stuff to do and I can't do that for you right now.

假设你是以“ubuntu”用户登录的,但是你想把一个作业添加到另一个用户的crontab中,比如“john”。您可以执行以下操作:

(sudo crontab -l -u john; echo "* * * * * command") | awk '!x[$0]++' | sudo crontab -u john -

此解决方案的大部分来源:https://www.baeldung.com/linux/create-crontab-script

我有吨的问题试图添加一个工作到另一个用户的crontab。它不断复制crontab,或者直接删除它们。不过,经过一些测试后,我相信这行代码将以非破坏性的方式将一个新作业附加到指定用户的crontab,包括不创建已经存在的作业。

谢谢大家的帮助。把我在这里和其他地方的发现拼凑起来,我得出了这个结论:

的代码

command="php $INSTALL/indefero/scripts/gitcron.php"
job="0 0 * * 0 $command"
cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -

我想不出如何在不重复自己的情况下消除对这两个变量的需求。

命令显然是我想调度的命令。Job接受$命令并添加调度数据。我需要在执行工作的代码行中分别使用这两个变量。

细节

Credit to duckyflip, I use this little redirect thingy (<(*command*)) to turn the output of crontab -l into input for the fgrep command. fgrep then filters out any matches of $command (-v option), case-insensitive (-i option). Again, the little redirect thingy (<(*command*)) is used to turn the result back into input for the cat command. The cat command also receives echo "$job" (self explanatory), again, through use of the redirect thingy (<(*command*)). So the filtered output from crontab -l and the simple echo "$job", combined, are piped ('|') over to crontab - to finally be written. And they all lived happily ever after!

简而言之:

这行代码过滤掉与命令匹配的任何cron作业,然后用新的cron作业写出剩余的cron作业,有效地充当“添加”或“更新”函数。 要使用它,您所要做的就是替换命令和作业变量的值。

echo "0 * * * * docker system prune --force >/dev/null 2>&1" | sudo tee /etc/cron.daily/dockerprune