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

感情迁移 提交于 2020-02-26 21:43:03

crontab是否具有用于在不使用编辑器的情况下创建cron作业的参数(crontab -e)。 如果是这样,那么从Bash脚本创建cronjob的代码是什么?


#1楼

这个较短的文件不需要临时文件,可以避免多次插入,并且可以更改现有条目的时间表。

说您有这些:

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中添加新行

#2楼

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

crontab <<EOF
00 09 * * 1-5 echo hello
EOF

#3楼

您可能可以将默认编辑器更改为ed,并使用heredoc进行编辑。

EDITOR=ed
export EDITOR

crontab -e << EOF
> a
> * * * * * Myscript
> * * * * * AnotherScript
> * * * * * MoreScript
> .
> w
> q
> EOF

请注意,该代码中的前导>表示按下回车/输入键以创建新行。

a表示APPEND,因此不会覆盖任何内容。

表示您已完成编辑。

w表示写更改。

q表示退出或退出ed。

你可以看看

crontab -l

您也可以删除条目。

EDITOR=ed
export EDITOR

crontab -e << EOF
> /Myscript/
> d
> .
> w
> q
> EOF

这将删除其中包含Myscript的crontab条目。

d表示删除/ /内的模式。

不再检查

crontab -l

这种解决方案在脚本内部的作用少了,当然> :)


#4楼

您可能会自动执行此操作,并且不希望将一个作业添加两次。 在这种情况下,请使用:

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


#5楼

仅在找不到所需字符串的情况下才编辑crontab的变体:

CMD="/sbin/modprobe fcpci"
JOB="@reboot $CMD"
TMPC="mycron"
grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!