Answers:
您可以按如下所示将其添加到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 ; echo "00 09 * * 1-5 echo hello") | crontab -
-更容易复制Edo的answear
;
与&&
对抗,如果情况安全守卫crontab -l
失败。因此,例如:(crontab -l && echo "0 0 0 0 0 some entry") | crontab -
crontab -l
如果没有crontab则失败,因此使用&&
使得脚本无法将第一个条目添加到crontab。
您也许可以即时进行
crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -
crontab -l
列出当前的crontab作业,进行cat
打印,echo
打印新命令,crontab -
并将所有打印的内容添加到crontab文件中。您可以通过执行新操作来查看效果crontab -l
。
crontab -l
列出当前的crontab作业,进行cat
打印,echo
打印新命令,crontab -
并将所有打印的内容添加到crontab文件中。你可以做一个新的看到效果crontab -l
no crontab for <username>
,但仍然可以使用。
(crontab -l ; echo "00 09 * * 1-5 echo hello") | 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 -
笔记:
谢谢大家的帮助。将在这里和其他地方找到的东西拼凑在一起,我想到了:
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"
,combined一起通过管道('|')传递crontab -
到,最后被写入。这行代码过滤掉与命令匹配的所有cron作业,然后用新的cron作业写出剩余的cron作业,实际上起到了“添加”或“更新”功能的作用。要使用此功能,您要做的就是交换command
和job
变量的值。
fgrep -v
crontab -l | fgrep -i -v "$command" | { cat; echo "$job"; } | crontab -l
编辑(固定覆盖):
cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -
crontab -l
失败但crontab -
成功,则您的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
本身。该文件不应是可执行文件,并且名称只能包含字母数字和连字符(更多详细信息请参见下文)。
为了给出一个完整的答案,让我们看一下crontab
vs 之间的区别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下的文件都可以执行,就像它们由运行部件运行(有关更多信息,请参见run-parts(8))。
资料来源: http : //manpages.ubuntu.com/manpages/trusty/man8/cron.8.html
从系统角度看,以这种方式管理分支容易且可扩展性强,但这并不总是最好的解决方案。
<job>
不应包含文件扩展名。
您可能会自动执行此操作,并且不希望将一个作业添加两次。在这种情况下,请使用:
__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问题中找到了那些。
sh: 1: Syntax error: "(" unexpected
使用sh。
<
和之间有空格,我会使用bash收到此错误(
。这意味着< (
失败了,但<(
行得通,除非您的日程安排中有星号...
cat <(crontab -l |grep -v "${CRON}") <(echo "${CRON}") | 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配置
echo-在std输出上创建输出的工具。printf,cat ...也可以
“-在字符串开头使用双引号表示您是专业人士
0,15,30,45 * * * *-标准cron运行时间表,此运行时间为每15分钟
ntpdate -u time.nist.gov-我要运行的实际命令
“-因为我的第一个双引号需要一个伙伴来关闭正在输出的行
>>-双重重定向附加而不是覆盖*
/etc/cron.d/vmclocksync-vmclocksync是我选择的文件名,位于/etc/cron.d/
*如果使用>重定向,则可以保证我们只有一个任务条目。但是,我们将有可能破坏现有文件中的任何其他规则。您可以自己决定是否适合使用>进行销毁,或者适合使用>>进行重复。另外,您也可以做一些令人费解的事情,包括检查文件名是否存在,文件名是否存在以及是否要添加任何重复项,但是我有事要做,但我不能这样做你现在。
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
CRON="1 2 3 4 5 /root/bin/backup.sh"
cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}")
将-w参数添加到grep精确命令中,而无需-w参数添加cronjob“ testing”会导致cron作业“ testing123”的删除
脚本函数来添加/删除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"
经过测试:
$ ./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
资料来源:我的大脑;)
您可能可以将默认编辑器更改为ed,并使用heredoc进行编辑。
EDITOR=ed
export EDITOR
crontab -e << EOF
> a
> * * * * * Myscript
> * * * * * AnotherScript
> * * * * * MoreScript
> .
> w
> q
> EOF
注意前导>,该代码中表示按下回车/输入键以创建新行。
在一个手段APPEND所以它不会覆盖任何东西。
的。表示您已完成编辑。
该w ^表示写的变化。
的q装置QUIT或退出编辑。
你可以看看
crontab -l
您也可以删除条目。
EDITOR=ed
export EDITOR
crontab -e << EOF
> /Myscript/
> d
> .
> w
> q
> EOF
这将删除其中包含Myscript的crontab条目。
所述d装置删除内的图案 / /。
不再检查
crontab -l
这种解决方案在脚本内部的作用少了,当然> :)