当前位置:  开发笔记 > 编程语言 > 正文

如何在没有交互式编辑器的情况下自动使用Bash创建一个cron作业?

如何解决《如何在没有交互式编辑器的情况下自动使用Bash创建一个cron作业?》经验,为你挑选了9个好方法。

crontab是否有一个参数来创建cron作业而不使用编辑器(crontab -e).如果是这样,那么代码会从Bash脚本创建一个cronjob?



1> dogbane..:

您可以按如下方式添加到crontab:

#write out current crontab
crontab -l > mycron
#echo new cron into cron file
echo "00 09 * * 1-5 echo hello" >> mycron
#install new cron file
crontab mycron
rm mycron

Cron线解释

* * * * * "command to be executed"
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

来源nixCraft.


(crontab -l; echo"00 09**1-5 echo hello")| crontab -
`(crontab -l; echo"00 09**1-5 echo hello")| crontab -` - 更容易复制Edo的衣服
你应该使用tempfile或mktemp
@MacUsers,`crontab -l`如果没有crontab则会失败,因此使用`&&`会使脚本无法将第一个条目添加到crontab中.
如果`crontab -l`失败,我建议改变`````&&`作为安全防范.所以,像:`(crontab -l && echo"0 0 0 0 0 some entry")| crontab -`
通过绕过安全防护来找到它:`(crontab -l 2>/dev/null; echo"0 0 0 0 0 some entry")| crontab -`
@moeseth我还没有尝试过(我来自移动设备),但是类似的东西应该可以工作((crontab -l && echo“ 0 0 0 0 0 some entry” |排序| uniq)| crontab -`

2> TheBonsai..:

你可以在飞行中做到这一点

crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -

crontab -l列出当前的crontab作业,cat打印它,echo打印新命令crontab -并将所有打印的内容添加到crontab文件中.你可以通过做一个新的来看到效果crontab -l.


不适用于我的Amazon EC2实例.相反,`(crontab -l; echo"00 09**1-5 echo hello")| crontab -`有效.
这看起来像[UUcatA]的候选者(http://porkmail.org/era/unix/award.html#cat).
`crontab -l`列出当前的crontab作业,`cat`打印它,`echo`打印新命令,`crontab -`将所有打印的东西添加到crontab文件中.您可以通过执行新的`crontab -l`来查看效果
谢谢,你能解释一下语法,还是指向一个解释它的网址?
为我服务.如果用户没有现有的crontab,你会看到`没有用于的crontab,但无论如何都可以.
您可能希望在最后一个命令之前通过“ sort | uniq”进行传递,以避免重复crontab中的条目(尽管这可能会更改行顺序)

3> MoonCactus..:

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

说你有这些:

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添加新行的风险


@moeseth:我显然在我的电脑上试过它(linux).我不建议随机不工作的东西:/
顺便说一下,27个人不能错(截至今天).所以请说明为什么它不适用于您的设置,所以我们可以提供帮助.
这可能是OSX问题.

4> Stoutie..:

谢谢大家的帮助.把我在这里和其他地方找到的东西拼凑在一起我想出了这个:

代码

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

我无法弄清楚如何在不重复自己的情况下消除对两个变量的需求.

command显然是我想安排的命令.job获取$command并添加调度数据.我在执行工作的代码行中分别需要两个变量.

细节

    感谢duckyflip,我使用这个小重定向thingy(<(*command*))将输出crontab -l转换为fgrep命令的输入.

    fgrep然后过滤掉$command(-v选项)的任何匹配,不区分大小写(-i选项).

    同样,小重定向thingy(<(*command*))用于将结果转换回cat命令的输入.

    cat命令还echo "$job"通过使用重定向thingy(<(*command*))再次接收(自解释).

    所以过滤后的输出crontab -l和简单的echo "$job"组合,都是管道('|')crontab -到最后写的.

    从那以后他们都过着快乐的生活!

简而言之:

这行代码过滤掉与命令匹配的任何cron作业,然后使用新的cron作业写出剩余的cron作业,实际上就像"添加"或"更新"功能.要使用它,您所要做的就是替换commandjob变量的值.


如果您更喜欢传统的从左到右的管道方式,请将最后一行替换为:`crontab -l | fgrep -i -v"$ command"| { 猫; 回声"$ job"; } | crontab -l`
为了其他人阅读的好处,这种方法的优点是您可以多次运行它而不必担心crontab中的重复条目(与所有其他解决方案不同).这是因为`fgrep -v`

5> duckyflip..:

编辑(固定覆盖):

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


请记住,Bash的进程替换吞噬了错误.如果`crontab -l`失败,但`crontab -`成功,你的crontab将是一个单行.

6> Mike Mackint..:

关于crontab的使用有很多好的答案,但没有提到更简单的方法,比如使用cron.

使用cron将利用位于的系统文件和目录/etc/crontab,/etc/cron.daily,weekly,hourly/etc/cron.d/:

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

在上面的例子中,我们创建了一个文件/etc/cron.d/,提供了成功执行命令的环境变量,并提供user了命令和command自身.此文件不应该是可执行文件,名称应仅包含字母数字和连字符(下面有更多详细信息).

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

crontab -- maintain tables for driving cron for individual users

对于那些想要在系统上的用户环境中运行工作的人来说,使用crontab可能非常有意义.

cron -- daemon to execute scheduled commands

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

从联机帮助页面中快速摘录为您提供了一些示例,说明了要做什么和不做什么:

/ etc/crontab和/etc/cron.d中的文件必须由root拥有,并且不能是group-或other-writable.与假脱机区域相反,/ etc/cron.d下的文件或/etc/cron.hourly,/etc/cron.daily,/etc/cron.weekly和/etc/cron.monthly下的文件也可能是符号链接,只要符号链接和它指向的文件都由root拥有./etc/cron.d下的文件不需要是可执行的,而/etc/cron.hourly,/etc/cron.daily,/etc/cron.weekly和/etc/cron.monthly下的文件也是如此,它们由运行部件运行(有关更多信息,请参阅运行部件(8)).

资料来源: http ://manpages.ubuntu.com/manpages/trusty/man8/cron.8.html

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



7> kvz..:

您可能正在自动执行此操作,并且您不希望单个作业添加两次.在这种情况下使用:

__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问题中找到了那些.



8> 小智..:

为了使用BASH脚本快速,轻松地创建/替换crontab,我使用了以下表示法:

crontab <



9> Gerald Schad..:

如果在那里找不到所需的字符串,则只编辑crontab的变体:

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

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有