crontab是否有不使用编辑器(crontab -e)创建cron作业的参数?如果是,从Bash脚本创建cron作业的代码是什么?
当前回答
我喜欢的解决方案是这样的:
(crontab -l | grep . ; echo -e "0 4 * * * myscript\n") | crontab -
这将确保您正确地处理底部的空白新行。为了避免crontab的问题,通常应该在crontab文件结束时添加一个空白的新行。上面的脚本确保它首先删除带有“grep .”部分的所有空行,然后在脚本末尾添加带有“\n”的新空行。如果现有crontab文件以空行结束,这还将防止在新命令上方出现空行。
其他回答
很有可能您正在将此工作自动化,并且您不希望单个工作添加两次。 在这种情况下使用:
__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问题中找到的。
假设你是以“ubuntu”用户登录的,但是你想把一个作业添加到另一个用户的crontab中,比如“john”。您可以执行以下操作:
(sudo crontab -l -u john; echo "* * * * * command") | awk '!x[$0]++' | sudo crontab -u john -
此解决方案的大部分来源:https://www.baeldung.com/linux/create-crontab-script
我有吨的问题试图添加一个工作到另一个用户的crontab。它不断复制crontab,或者直接删除它们。不过,经过一些测试后,我相信这行代码将以非破坏性的方式将一个新作业附加到指定用户的crontab,包括不创建已经存在的作业。
脚本函数添加cronjob。检查重复条目,可用表达式* > "
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
来源:我的大脑;)
(2>/dev/null crontab -l ; echo "0 3 * * * /usr/local/bin/certbot-auto renew") | crontab -
cat <(crontab -l 2>/dev/null) <(echo "0 3 * * * /usr/local/bin/certbot-auto renew") | crontab -
#输出当前crontab
crontab -l > mycron 2>/dev/null
#echo new cron到cron文件中
echo "0 3 * * * /usr/local/bin/certbot-auto renew" >> mycron
#安装新的cron文件
crontab mycron
rm mycron
这个较短的表不需要临时文件,它不受多次插入的影响,并且允许您更改现有条目的计划。
假设你有这些:
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添加新行风险的情况下更改时间表