是否可以使用 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 -
...
我在 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 -
...