我尝试自己进行一些“编码”,结果如下:
00 02 * * 1,3,5 sudo shutdown -r
@midnight sudo apt-get update && sleep 60 && apt-get upgrade -y
@reboot sleep 60 && sudo netplan apply && sleep 15 && sudo omd start website
重启后,网络和网站都必须正常运行,这一点至关重要。另外,这个1,3,5
部分可行吗?这会重启 Mo、We 和 Fr 上的机器吗?在更新/升级后安排重启是否明智?
答案1
一般性评论:不要sudo
在 crontab 中使用user
,而是考虑将这些命令放在root
crontab 中,这样它们就可以在没有 sudo 的情况下运行。
至于您的 3 条 crontab 行:
@midnight sudo apt-get update && sleep 60 && apt-get upgrade -y
用这种方法做是完全可行的apt-get update
。apt-get upgrade -y
(不适用于生产服务器,并且条件是您了解无人值守升级的含义。)
00 02 * * 1,3,5 sudo 关机-r
我认为没有必要每周重启 3 次。我自己使用这个非常简单的重启脚本:(称为auto-reboot.sh
)
#!/bin/bash
[[ -f /var/run/reboot-required.pkgs ]] && reboot
因此,我每周在升级和清理脚本之后使用 cron 运行此脚本。它仅在机器需要重新启动时才重新启动(如果/var/run/reboot-required.pkgs
存在)。(再次强调,这不适用于生产服务器。)
@reboot sleep 60 && sudo netplan apply && sleep 15 && sudo omd start website
我不明白为什么你需要netplan apply
在重启时运行。
此外,启动依赖于其他服务或条件(例如网络)的服务的更可靠方法是创建一个 systemd.service
来完成这项工作。这方面有几个教程(1,2),我推荐您看一下。
答案2
没有。
- 您不需要在 cron 中使用 sudo。如果您需要访问需要 root 权限的命令,请使用 root crontab
- 在 cron 中始终使用绝对路径。
- 而且您不应该在无人值守的情况下升级 --production-- 服务器;您需要手动进行。如果它是桌面或测试/暂存服务器,那就太好了。我的个人经验来自使用 CLOUD 服务器:重启过程中出现任何问题都是致命的。
但如果你真的想这样做,我会添加以下 3 点...
- 将日志记录添加到“apt”命令
- 添加一种方法,通过邮件向您发送 apt 命令期间打印的内容。
- 在执行“apt”之前,您确实应该制作一个完整的系统备份,并将其存储在服务器之外。当更新/升级出错并影响您的系统时(100 次中有 99 次不会影响您的系统,但您不希望这种情况发生 ;)),让您的系统恢复到上次的工作状态比修复问题更重要。
sleep 60 && sudo netplan apply && sleep 15 && sudo omd start website
这应该不是必需的。我会用“服务”来安排。这样你就可以创建一个等待彼此的命令链。“睡眠 60”和“睡眠 15”……如果需要 61 和 16 怎么办?服务会帮你解决这个问题。
另外,1、3、5 部分可行吗?这会重新启动 Mo、We 和 Fr 上的机器吗?
正如 Dan 在评论中所说:crontab大师插入的 crontab 规则状态为“星期一、星期三和星期五 02:00”。
如果没有理由重启,我不会执行它。我的服务器已经运行了 5 年多,每隔一段时间我就会清理一次内存问题之类的东西 :+
答案3
我同意其他答案的所有内容,但请允许我补充一点……
无人看管的情况下运行很危险apt-get
。少数应用程序在升级和升级安装期间会询问问题,还有一些应用程序如果放在后台则需要键盘输入,即使不需要键盘输入,它们也会挂起。
尝试像这样在后台运行 apt-get 很可能会导致系统更新中断,必须手动配置和恢复。
无人值守升级过程应该无需干预即可自动安装关键更新。
如果您的机器崩溃了,您需要调查原因。也许整夜运行硬件诊断。检查崩溃前后的日志。也许检查是否有什么东西耗尽了内存并导致机器冻结。等等...
此外,您需要apt autoremove
偶尔运行,否则内核更新将会收集,直到您的磁盘填满。