crontab是否有不使用编辑器(crontab -e)创建cron作业的参数?如果是,从Bash脚本创建cron作业的代码是什么?


当前回答

假设你是以“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,包括不创建已经存在的作业。

其他回答

如果你正在使用Vixie Cron,例如在大多数Linux发行版中,你可以把一个文件放在/etc/cron.D与个人cronjob。

当然,这只适用于根。如果您的系统支持这一点,您应该在其中看到几个示例。(注意行中包含的用户名,语法与旧的/etc/crontab相同)

这是cron中一个可悲的错误特性,没有办法作为普通用户来处理这个问题,而且很多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}")

给grep exact命令添加-w参数,不带-w参数添加cronjob "testing"会导致删除cronjob "testing123"

脚本函数添加/删除cronjob。无重复条目:

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

这个较短的表不需要临时文件,它不受多次插入的影响,并且允许您更改现有条目的计划。

假设你有这些:

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添加新行风险的情况下更改时间表

下面是一个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"