我将如何创建一个不响应的脚本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 Exception
(Interrupt
扩展)将导致程序在中断信号上表现“异常”。在 Java 上,捕获Throwable
也有类似的行为。
捕获中断信号可能是一个不错的选择,但是您必须考虑何时开始以及何时停止捕获它,其间可能发生什么以及您的应用程序将如何响应此“捕获”(即您的应用程序是否会死掉或抛出异常或其他错误吗?它会绕过您的应用程序但仍然杀死 apt-get 等)。
另外,kill pid
可能会导致不同的行为,据我所知,kill -9 pid
无论您做什么都会杀死您的进程。我会考虑将其作为保存到文件的后台作业运行,并监视所述文件的更改,直到更新完成(甚至可能在屏幕上显示它),可能同时救援/捕获/等SIGINT。我还可能会考虑设置运行级别之类的东西或避免简单的东西kill pid
,因为需要 akill -9 pid
可能会避免诚实的错误。