如何自动使用bash没有交互式编辑器创建一个cron job?

问题描述 投票:332回答:18

crontab中是否有不使用编辑器(crontab -e命令)创建cron作业的理由。如果是的话,会是什么代码创建一个从bash脚本一个cronjob?

bash shell cron
18个回答
490
投票

您可以添加到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


3
投票

如果您使用的vixie cron在,例如在大多数Linux发行版,你可以把一个文件/etc/cron.d中与个人的cronjob。

这仅适用于课程的根。如果您的系统支持这个你应该看到有几个例子。 (注意包括在线路的用户名,在相同的语法旧/ etc / crontab中)

这是在cron一个悲伤的不良特性,有没有办法处理这个作为一个普通用户,并且有这么多的cron实现有没有办法在所有处理这个问题。


2
投票

bash脚本添加cron作业没有交互式编辑器。下面的代码有助于增加使用Linux的文件一个cronjob。

#!/bin/bash

cron_path=/var/spool/cron/crontabs/root

#cron job to run every 10 min.
echo "*/10 * * * * command to be executed" >> $cron_path

#cron job to run every 1 hour.
echo "0 */1 * * * command to be executed" >> $cron_path

1
投票

下面是用于添加命令到crontab不重复一个bash函数

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"

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

添加-w参数给grep命令精确,没有-w参数添加的cronjob“测试”原因删除cron作业的“是testing123”

脚本函数添加/删除cron作业。没有重复的条目:

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"

测试:

$ ./cronjob_editor.sh '*/10 * * * *' 'echo "this is a test" > export_file' add
$ crontab  -l
$ */10 * * * * echo "this is a test" > export_file

0
投票

不,是在crontab中没有选项来修改的cron文件。

你必须:取当前的cron文件(的crontab -l> newfile中),改变它,把新文件到位(crontab中的newfile)。

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

LLP,安德烈


0
投票

脚本函数添加cronjobs。检查是否重复,可用表情*>“

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
}

测试:

$ ./cronjob_creator.sh '*/10 * * * *' 'echo "this is a test" > export_file'
$ crontab  -l
$ */10 * * * * echo "this is a test" > export_file

来源:我的大脑;)


0
投票

我在此优选的解决办法是这样的:

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

这将确保你正确处理底部的空白新的生产线。为了避免与crontab的问题,你通常应该结束与一个空白的新线crontab文件。和上面的脚本确保它首先删除任何空行用的“grep”。部分,然后在一个新的空白行中结束,在脚本的末尾的“\ n”个补充。这也将避免让您的新命令上方插入空白行,如果你现有的crontab文件以一个空行结束。


0
投票

所以,在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 CONFIGS

回声 - 车辆制造性病输出出来。 printf的,猫...会工作,以及

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

0,15,30,45 * * * * - 标准的cron运行计划,这其中每15分钟一班

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

“ - 因为我的第一个双引号需要一个哥们关闭线是输出

>> - 双重定向追加改写,而不是*

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


*如果我们使用>重定向,我们可以保证我们只有一个任务条目。但是,我们将在现有的文件吹走任何其他规则的风险。你可以自己决定,如果可能的破坏,>是正确的或可能的重复>>是给你的。或者,你可以做一些令人费解的或涉及到检查文件名是否存在,如果存在任何东西,以及是否要添加任何形式的duplicate--,但是,我有事情要做,我不能这样做对你现在。


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

-5
投票

你也许可以更改默认的编辑器来编辑和使用定界符进行编辑。

EDITOR=ed
export EDITOR

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

需要注意的领先>中的代码意味着返回/确定键被按下以创建一个新行。

在一指追加,所以它不会覆盖任何东西。

的。意味着你完成编辑。

w表示写的变化。

将q装置QUIT或退出编辑。

你可以检查出来

crontab -l

您可以删除条目太多。

EDITOR=ed
export EDITOR

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

这将删除它与MYSCRIPT crontab条目中。

该d是指删除/ /内部的图案。

没有检查一遍

crontab -l

该解决方案的脚本里面工作过少的>当然:-)的


289
投票

您可能能够做到这一点的即时

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

crontab -l列出当前的crontab作业,cat打印它,echo打印新的命令和crontab -将所有印刷的东西到crontab文件。你可以看到通过做一个新的crontab -l效果。


75
投票

这较短的不需要临时文件,它不受多次插入,并且它可以让你改变现有项目的进度。

假设你有这些:

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的风险而改变

38
投票

谢谢大家的帮助。拼凑我发现这里和其他地方,我想出了这一点:

编码

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并添加调度数据。我的代码,做工作的需要行两个变量分别。

细节

  1. 感谢duckyflip,我用这个小重定向啄(<(*command*))打开crontab -l的输出到输入的fgrep命令。
  2. 然后fgrep滤除$command的(-v选项)不区分大小写(-i选项)任何匹配。
  3. 再次,小重定向啄(<(*command*))用于打开结果返回到输入的cat命令。
  4. cat命令还接收echo "$job"(自我解释),再次,通过使用重定向啄(<(*command*))的。
  5. 因此,从过滤crontab -l输出的和简单echo "$job",合并,通过管道输送(“|”)到crontab -最终被写入。
  6. 他们都过着幸福快乐的日子!

简而言之:

这行代码过滤掉匹配的命令,任何cron作业,然后写出剩下的cron作业用新的,有效的作用就像一个“添加”或“更新”功能。要使用此,所有你需要做的就是换出的commandjob变量的值。


26
投票

EDIT(固定重写):

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

13
投票

已经有很多围绕用crontab的很好的答案,但没有提到一个更简单的方法,如使用cron

使用cron将采取位于/etc/crontab/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/一个文件,规定的命令成功执行的环境变量,并提供了该命令的usercommand本身。该文件不应该是可执行文件和名称应该只包含(更多详情如下)字母数字和连字符。

为了给出一个完整的答案不过,让我们来看看VS crontab 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拥有,且不得基或其他可写。与此相反的假脱机区域,下/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
投票

机会是你的自动化这一点,你不希望一个作业添加两次。在这种情况下使用:

__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

发现那些another SO question


5
投票

对于一个很好的快速和肮脏的创建/替换从一个bash脚本一个crontab的,我用这个符号:

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

5
投票

一个变体如果所需的字符串没有找到,只有编辑的crontab:

CMD="/sbin/modprobe fcpci"
JOB="@reboot $CMD"
TMPC="mycron"
grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")
© www.soinside.com 2019 - 2024. All rights reserved.