如何创建一个不能轻易退出的脚本

如何创建一个不能轻易退出的脚本

我将如何创建一个不响应的脚本Ctrl-C?这还应该防止脚本启动的任何进程被杀死(我试图防止apt-get upgrade被杀死)。

(我已经做了一些互联网搜索,但我只找到了有关如何杀死流氓进程的问题。)

语境:我正在为学术 VM 集群创建 Linux 主 VHD。创建机器后,它将以 root 身份在控制台上登录并执行我的脚本,这将更新机器、创建新用户并启用 SSH。如果有人在完成更新之前登录控制台,我想防止他们(意外或故意)使用 取消更新过程Ctrl-C

答案1

设置INT要忽略的信号:

trap '' INT

这将导致 SIGINT(即 Ctrl-C 发送的信号)对您的脚本不执行任何操作。

我不太清楚这样做的用户体验后果;如果脚本陷入需要很长时间才能完成的操作,这可能会很烦人。最好警告用户在忽略信号之前脚本不应(也不能轻易)被中断。

答案2

使用 Perl 脚本,就像这样简单:

#!/usr/bin/perl
use strict;
use warnings;

$SIG{'INT'} = "IGNORE"; 

#do stuff. 

不过我建议,你考虑过一份“at”工作吗?

echo "sudo apt-get upgrade >> /tmp/upgrade.log" | at now

这将把它作为调度程序中的任务启动。

答案3

为什么不将程序作为后台作业运行,这样就没有终端来发出中断ctrl + c

那么终止该进程的唯一方法是发出sudo kill PID需要 root 权限的命令。但是,如果这个人拥有root权限,那么我认为你只是运气不好......如果他们拥有root权限并想要结束该过程,他们会......

答案4

取决于您构建它的内容和方式。

虽然捕获可能是一个有趣的选择,但我想某些环境可能会导致它无法按预期工作。

例如,在 Rails 上, rescuingInterrupt以及 rescuing ExceptionInterrupt扩展)将导致程序在中断信号上表现“异常”。在 Java 上,捕获Throwable也有类似的行为。

捕获中断信号可能是一个不错的选择,但是您必须考虑何时开始以及何时停止捕获它,其间可能发生什么以及您的应用程序将如何响应此“捕获”(即您的应用程序是否会死掉或抛出异常或其他错误吗?它会绕过您的应用程序但仍然杀死 apt-get 等)。

另外,kill pid可能会导致不同的行为,据我所知,kill -9 pid无论您做什么都会杀死您的进程。我会考虑将其作为保存到文件的后台作业运行,并监视所述文件的更改,直到更新完成(甚至可能在屏幕上显示它),可能同时救援/捕获/等SIGINT。我还可能会考虑设置运行级别之类的东西或避免简单的东西kill pid,因为需要 akill -9 pid可能会避免诚实的错误。

相关内容