bash- Control-C 行为 (^C) / gksudo 与 sudo

bash- Control-C 行为 (^C) / gksudo 与 sudo

这是关于ctrl+键按下在实例上与在实例上c执行时产生的不同效果。gksudosudo

我执行了以下步骤gksudo来读取安装失败日志文件:

$ gksudo gedit /tmp/vmware-root/setup-5686.log

当我想要关闭 gedit 实例时,我按 Alt-Tab 键切换到(原始)控制台并按下ctrl+ c。控制权返回到控制台,但gedit程序仍在正常运行。

sudo这与上一次调用(我不建议这样做)中的行为不同。通过使用sudo,^C 将控制权返回给控制台并关闭程序gedit

我是 Linux 新手...这是正常现象吗?为什么?

答案1

gksudo这是正常/的正常行为gksu,至少在 Xubuntu 和 Linux Mint XFCE 上是如此。终止 (CTRL+C) gksu gedit(gksudo 是指向 gksu 的链接) 会使 gedit 仍在运行。

man gksu有以下可能有用的信息:

还请注意,如果您调用 gksu 命令,库将使用 /apps/gksu/sudo-mode gconf 键决定是否应使用 su 或 sudo 作为后端。您可以使用 gksudo 命令或使用 --sudo-mode 和 --su-mode 选项强制使用后端。

但使用任一选项进行测试都会产生相同的行为。


这个测试可能会有所启发:

$ gksu gedit

[然后在另一个终端]

$ ps -ef|grep [g]edit
UID        PID  PPID  C STIME TTY          TIME CMD
mint      6878  6701  0 23:04 pts/0    00:00:00 gksu gedit
root      6879  6878  0 23:04 ?        00:00:00 /usr/bin/sudo -H -S -p GNOME_SUDO_PASS -u root -- gedit
root      6880  6879  0 23:04 ?        00:00:00 gedit

[在第一个终端中终止(CTRL+C)后gksu gedit,它不会停止sudogedit]

$ ps -ef|grep [g]edit
root      6879     1  0 23:04 ?        00:00:00 /usr/bin/sudo -H -S -p GNOME_SUDO_PASS -u root -- gedit
root      6880  6879  0 23:04 ?        00:00:00 gedit

[杀死第一个sudo(使用另一个 sudo)确实会杀死gedit]

$ sudo kill 6879
$ ps -ef|grep [g]edit

就像sudo gedit在终端中运行会启动gedit,而 CTRL+Csudo会终止gedit。但是,如果我关闭终端,sudogedit仍然会继续运行。

因此,sudo不管调用它的程序(gksu或终端)是否被终止,它和它启动的任何程序都会继续运行。


以下摘录man sudo也许也会有帮助:

进程模型
当 sudo 运行命令时,它会调用 fork(2),如上所述设置执行环境,并在子进程中调用 execve 系统调用。主 sudo 进程等待命令完成,然后将命令的退出状态传递给安全策略的 close 函数并退出。

信号处理
当命令作为 sudo 进程的子进程运行时,sudo 会将收到的信号转发给命令。除非命令在新的 pty 中运行,否则不会转发 SIGHUP、SIGINT 和 SIGQUIT 信号,除非它们是由用户进程(而不是内核)发送的。否则,每次用户输入 control-C 时,命令都会收到两次 SIGINT。某些信号(例如 SIGSTOP 和 SIGKILL)无法被捕获,因此不会转发给命令。一般来说,当您希望暂停 sudo 正在运行的命令时,应使用 SIGTSTP 而不是 SIGSTOP。

相关内容