是否可以使用 bash 脚本截断我现有的 crontab 文件?

is it possible to truncate my existing crontab file with a bash script?

我在 AWS 上的部分应用程序部署管道包括 bash 更新主机 CRON 文件的脚本,此外 运行 ruby 作为用户安装

sudo -u myuser bash << eof
  echo 'running bundle install'
/home/myuser/.rvm/gems/ruby-2.4.1/wrappers/bundle install
  echo 'install cron tasks'
  (crontab -l 2>/dev/null; echo "TZ=America/Los_Angeles")| crontab -
  (crontab -l 2>/dev/null; echo "CRON_TZ=America/Los_Angeles")| crontab -
  (crontab -l 2>/dev/null; echo "00 13 * * * /bin/bash /var/www/application/bin/daily-notifications.sh")| crontab -
  crontab -l
eof

不幸的是,为了更新我的 AMI 映像,我需要首先手动进入我的 crontab 文件并在获取 OS 的新映像之前先清除 cron 任务,因为上面的代码是“附加" 到现有文件末尾的每一行

是否可以在上面的 bash 脚本中以编程方式清除 cron 任务?

是的,根据 crontab manpage:

SYNOPSIS
       crontab [ -u user ] file
       crontab [ -u user ] [ -i ] { -e | -l | -r }

DESCRIPTION
[...]
       The -r option causes the current crontab to be removed.

所以你会使用命令crontab -r

而不是擦除 crontab 文件然后 运行 一个脚本附加到它(注意:整个 crontab -l 2>/dev/null; ... 位是附加而不是替换),为什么不重写脚本到直接替换就可以了?

sudo -u myuser bash << OuterEOF
  echo 'running bundle install'
/home/myuser/.rvm/gems/ruby-2.4.1/wrappers/bundle install
  echo 'install cron tasks'
  crontab - << InnerEOF
  TZ=America/Los_Angeles
  CRON_TZ=America/Los_Angeles
  00 13 * * * /bin/bash /var/www/application/bin/daily-notifications.sh
InnerEOF
  crontab -l
OuterEOF

请注意,此方法涉及 here-document 内的 here-document,因此请确保使用不同的分隔符(不要缩进,否则将无法识别)。如果您不喜欢那样,还有许多其他方法可以将多行发送到 crontab - 命令,例如 printf:

...
  printf '%s\n' \
    "TZ=America/Los_Angeles" \
    "CRON_TZ=America/Los_Angeles" \
    "00 13 * * * /bin/bash /var/www/application/bin/daily-notifications.sh" |
    crontab -
...