如何在没有交互式编辑器的情况下自动创build使用Bash的cron作业?
crontab是否具有创buildcron作业而不使用编辑器(crontab -e)的参数? 如果是这样,代码将创build一个Bash脚本的cronjob?
你可以添加到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
克龙线解释
* * * * * "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 | { cat; echo "0 0 0 0 0 some entry"; } | 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直接匹配string,因为我们不想将其解释为正则expression式
- 我们也忽略了时间安排,只查找命令。 这条路; 日程安排可以被改变,而不会增加一个新的行到crontab的风险
感谢大家的帮助。 把我在这里和其他地方find的东西拼凑在一起,我想出了这个:
代码
command="php $INSTALL/indefero/scripts/gitcron.php" job="0 0 * * 0 $command" cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -
我无法弄清楚如何消除这两个variables的需要,而不用重复自己。
command
显然是我想要安排的命令。 job
需要$command
并添加调度数据。 我在工作的代码行中分别需要两个variables。
细节
- 感谢duckyflip,我使用这个小小的redirectthingy(
<(*command*)
)将crontab -l
的输出转换为fgrep
命令的input。 -
fgrep
然后过滤掉任何匹配的$command
(-v
选项),不区分大小写(-i
选项)。 - 再次,小redirectthingy(
<(*command*)
)用于将结果转回为cat
命令的input。 -
cat
命令还通过使用redirectthingy(<(*command*)
)来接收echo "$job"
(自我解释)。 - 因此,从
crontab -l
过滤的输出和简单的echo "$job"
结合在一起,通过pipe道('|')传递给crontab -
最终被写入。 - 他们都过着幸福的生活!
简而言之:
这行代码过滤掉了与命令匹配的所有cron作业,然后用新的cron作业写出剩余的cron作业,实际上就像“添加”或“更新”function一样。 要使用这个,你所要做的就是换出command
和job
variables的值。
编辑(固定覆盖):
cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -
你有可能自动化这个,你不希望一个工作增加两次。 在这种情况下使用:
CRON="1 2 3 4 5 /root/bin/backup.sh" cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}")
这只适用于你使用BASH。 我不知道正确的DASH( sh
)语法。
如果在那里没有find想要的string,只能编辑crontab:
CMD="/sbin/modprobe fcpci" JOB="@reboot $CMD" TMPC="mycron" grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")
为了使用BASH脚本创build/更换crontab,我使用了下面的表示法:
crontab <<EOF 00 09 * * 1-5 echo hello EOF
围绕crontab的使用已经有很多很好的答案,但没有提到一个简单的方法,比如使用cron
。
使用cron
可以利用位于/etc/crontab
, /etc/crontab
, /etc/cron.daily,weekly,hourly
, /etc/cron.daily,weekly,hourly
或/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/
创build了一个文件,提供了命令成功执行的环境variables,并为user
提供了命令和command
本身。 这个文件不应该是可执行的,名字只能包含字母数字和连字符(下面更多的细节)。
为了给出一个彻底的答案,让我们来看看crontab
和cron/crond
之间的区别:
crontab -- maintain tables for driving cron for individual users
对于那些想要在系统上的用户上下文中运行这个工作的人来说,使用crontab
可能是非常有意义的。
cron -- daemon to execute scheduled commands
对于那些使用configurationpipe理或想要为其他用户pipe理作业的用户,在这种情况下我们应该使用cron
。
从手册页中快速摘录了几个例子,说明要做什么和不做什么:
/ etc / crontab和/etc/cron.d中的文件必须由root拥有,并且不能是组或其他可写的。 与spool区域不同,/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
以这种方式pipe理cron从系统angular度来看更容易和更具可扩展性,但并不总是最好的解决scheme。
如果您使用的是Vixie Cron,例如在大多数Linux发行版上,您可以将文件放在/etc/cron.d中,并使用单独的cronjob。
这当然只适用于根。 如果你的系统支持这个,你应该看到几个例子。 (注意包含在行中的用户名,使用与旧的/ etc / crontab相同的语法)
在cron中,这是一个令人遗憾的错误,那就是没有办法像常规用户那样处理这个问题,而且这么多的cron实现根本无法处理这个问题。
不,在crontab中没有选项来修改cron文件。
您必须:取得当前的cron文件(crontab -l> newfile),将其更改并放置新文件(crontab newfile)。
如果你熟悉perl,你可以使用这个模块Config :: Crontab 。
LLP,Andrea
这里是一个bash函数,用于向crontab
添加一个没有重复的命令
function addtocrontab () { local frequency=$1 local command=$2 local job="$frequency $command" cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab - } addtocrontab "0 0 1 * *" "echo hello"
脚本function添加cronjobs。 检查重复的条目,可用的expression式*>“
cronjob_creator () { # usage: cronjob_creator '<interval>' '<command>' if [[ -z $1 ]] ;then printf " no interval specified\n" elif [[ -z $2 ]] ;then printf " no command specified\n" else CRONIN="/tmp/cti_tmp" crontab -l | grep -vw "$1 $2" > "$CRONIN" echo "$1 $2" >> $CRONIN crontab "$CRONIN" rm $CRONIN fi }
testing:
$ ./cronjob_creator.sh '*/10 * * * *' 'echo "this is a test" > export_file' $ crontab -l $ */10 * * * * echo "this is a test" > export_file
来源:我的大脑;)
CRON="1 2 3 4 5 /root/bin/backup.sh" cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}")
将-w参数添加到grep exact命令中,不带-w参数添加cronjob“testing”会导致删除cron作业“testing123”
脚本function添加/删除cronjobs。 没有重复条目:
cronjob_editor () { # usage: cronjob_editor '<interval>' '<command>' <add|remove> if [[ -z "$1" ]] ;then printf " no interval specified\n" ;fi if [[ -z "$2" ]] ;then printf " no command specified\n" ;fi if [[ -z "$3" ]] ;then printf " no action specified\n" ;fi if [[ "$3" == add ]] ;then # add cronjob, no duplication: ( crontab -l | grep -v -F -w "$2" ; echo "$1 $2" ) | crontab - elif [[ "$3" == remove ]] ;then # remove cronjob: ( crontab -l | grep -v -F -w "$2" ) | crontab - fi } cronjob_editor "$1" "$2" "$3"
testing:
$ ./cronjob_editor.sh '*/10 * * * *' 'echo "this is a test" > export_file' add $ crontab -l $ */10 * * * * echo "this is a test" > export_file
您可以将默认编辑器更改为ed并使用heredoc进行编辑。
EDITOR=ed export EDITOR crontab -e << EOF > a > * * * * * Myscript > * * * * * AnotherScript > * * * * * MoreScript > . > w > q > EOF
注意在该代码中的前导>意味着按下了返回/回车键来创build一个新的行。
一个意思是APPEND,所以它不会覆盖任何东西。
的。 意味着你正在编辑。
w表示写入更改。
q表示退出或退出编辑。
你可以检查出来
crontab -l
您也可以删除一个条目。
EDITOR=ed export EDITOR crontab -e << EOF > /Myscript/ > d > . > w > q > EOF
这将使用Myscript删除crontab条目。
d意味着删除/ /中的模式。
没有再检查一次
crontab -l
这个解决scheme在一个脚本里面工作的太less了,当然:-)