我最近有过编写 shell 脚本的经历,该脚本消耗了所有资源,导致服务器崩溃(并损坏了分区)。该脚本与 cron 作业挂钩,似乎运行时间比执行间隔时间更长,随着时间的推移,情况会失控。
现在,我已经修改了它以记录其运行状态,并且不会同时运行多次。我的问题是:还有其他简单的方法可以保护脚本免受危害吗?是否有一个标准的列表,列出脚本应执行的操作以正常运行、不消耗太多资源、优雅地失败、提醒合适的人员等?
基本上:我还应该避免哪些其他陷阱?
答案1
计算机会严格按照指令行事。确保脚本“正常运行”的唯一方法是编写脚本,使其在所有情况下都能正常运行。
一些基本建议:
- 实施某种监控系统。
你的系统在你不知情的情况下崩溃了,这说明你要么没有监控系统,要么你当前的系统不够好。
花点时间确保你的服务器告诉你有问题前他们摔倒了。 - 在从 cron 运行的脚本中包含适当的保护措施。
您的脚本踩到了自己的尾巴。这不应该发生。
您已经从惨痛的经历中吸取了教训,您需要防范这种事情(并且如果发生这种情况,请让系统通知您)。 - 更彻底地设计和测试。
仔细评估您要部署的每个脚本,以确保它不会产生不良的副作用。如果您能想象到失败的情况,请对其进行测试(并正确处理!)。
花时间模拟失败(通过在脚本中将条件硬编码为 true,或通过生成环境来测试您的检测逻辑。
答案2
您所谈论的保护措施取决于您的脚本正在做什么。例如,在自动修改某些重要文件之前,最好先备份它。如果脚本以某种方式失败并损坏了这个重要文件,那么您是安全的,因为您有备份等等。
需要提到的一件重要的事情是记录,记录,记录。如果您的脚本在后台运行,而没有显示其进度和正在执行的操作的日志文件,您将无法了解近期或远期可能出现的问题。不要忘记包含每个日志条目的时间戳,并启用 NTP 服务以准确了解发生这种情况的时间。
答案3
最后,我们现在在虚拟机内运行脚本。这极大地限制了可能造成的损害范围。
Linux 的可怕之处在于(至少对我来说)微小的拼写错误或错误都可能造成毁灭性的影响。即使是像运行带有 ${VARIABLE} 的命令这样的操作,如果该变量为空或包含空格,也可能产生完全不同(且具有破坏性)的含义。