crontab中是否有不使用编辑器(crontab -e命令)创建cron作业的理由。如果是的话,会是什么代码创建一个从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。
如果您使用的vixie cron在,例如在大多数Linux发行版,你可以把一个文件/etc/cron.d中与个人的cronjob。
这仅适用于课程的根。如果您的系统支持这个你应该看到有几个例子。 (注意包括在线路的用户名,在相同的语法旧/ etc / crontab中)
这是在cron一个悲伤的不良特性,有没有办法处理这个作为一个普通用户,并且有这么多的cron实现有没有办法在所有处理这个问题。
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
下面是用于添加命令到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"
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
不,是在crontab中没有选项来修改的cron文件。
你必须:取当前的cron文件(的crontab -l> newfile中),改变它,把新文件到位(crontab中的newfile)。
如果你熟悉Perl,你可以使用这个模块Config::Crontab。
LLP,安德烈
脚本函数添加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
来源:我的大脑;)
我在此优选的解决办法是这样的:
(crontab -l | grep . ; echo -e "0 4 * * * myscript\n") | crontab -
这将确保你正确处理底部的空白新的生产线。为了避免与crontab的问题,你通常应该结束与一个空白的新线crontab文件。和上面的脚本确保它首先删除任何空行用的“grep”。部分,然后在一个新的空白行中结束,在脚本的末尾的“\ n”个补充。这也将避免让您的新命令上方插入空白行,如果你现有的crontab文件以一个空行结束。
所以,在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--,但是,我有事情要做,我不能这样做对你现在。
echo "0 * * * * docker system prune --force >/dev/null 2>&1" | sudo tee /etc/cron.daily/dockerprune
你也许可以更改默认的编辑器来编辑和使用定界符进行编辑。
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
该解决方案的脚本里面工作过少的>当然:-)的
您可能能够做到这一点的即时
crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -
crontab -l
列出当前的crontab作业,cat
打印它,echo
打印新的命令和crontab -
将所有印刷的东西到crontab文件。你可以看到通过做一个新的crontab -l
效果。
这较短的不需要临时文件,它不受多次插入,并且它可以让你改变现有项目的进度。
假设你有这些:
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 -
笔记:
谢谢大家的帮助。拼凑我发现这里和其他地方,我想出了这一点:
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
并添加调度数据。我的代码,做工作的需要行两个变量分别。
<(*command*)
)打开crontab -l
的输出到输入的fgrep
命令。fgrep
滤除$command
的(-v
选项)不区分大小写(-i
选项)任何匹配。<(*command*)
)用于打开结果返回到输入的cat
命令。cat
命令还接收echo "$job"
(自我解释),再次,通过使用重定向啄(<(*command*)
)的。crontab -l
输出的和简单echo "$job"
,合并,通过管道输送(“|”)到crontab -
最终被写入。这行代码过滤掉匹配的命令,任何cron作业,然后写出剩下的cron作业用新的,有效的作用就像一个“添加”或“更新”功能。要使用此,所有你需要做的就是换出的command
和job
变量的值。
EDIT(固定重写):
cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -
已经有很多围绕用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/
一个文件,规定的命令成功执行的环境变量,并提供了该命令的user
和command
本身。该文件不应该是可执行文件和名称应该只包含(更多详情如下)字母数字和连字符。
为了给出一个完整的答案不过,让我们来看看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是从系统角度更容易,更可扩展,但不会永远是最好的解决方案。
机会是你的自动化这一点,你不希望一个作业添加两次。在这种情况下使用:
__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。
对于一个很好的快速和肮脏的创建/替换从一个bash脚本一个crontab的,我用这个符号:
crontab <<EOF
00 09 * * 1-5 echo hello
EOF
一个变体如果所需的字符串没有找到,只有编辑的crontab:
CMD="/sbin/modprobe fcpci"
JOB="@reboot $CMD"
TMPC="mycron"
grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")