这是关于ctrl+键按下在实例上与在实例上c执行时产生的不同效果。gksudo
sudo
我执行了以下步骤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
,它不会停止sudo
或gedit
]
$ 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
。但是,如果我关闭终端,sudo
它gedit
仍然会继续运行。
因此,sudo
不管调用它的程序(gksu
或终端)是否被终止,它和它启动的任何程序都会继续运行。
以下摘录man sudo
也许也会有帮助:
进程模型
当 sudo 运行命令时,它会调用 fork(2),如上所述设置执行环境,并在子进程中调用 execve 系统调用。主 sudo 进程等待命令完成,然后将命令的退出状态传递给安全策略的 close 函数并退出。信号处理
当命令作为 sudo 进程的子进程运行时,sudo 会将收到的信号转发给命令。除非命令在新的 pty 中运行,否则不会转发 SIGHUP、SIGINT 和 SIGQUIT 信号,除非它们是由用户进程(而不是内核)发送的。否则,每次用户输入 control-C 时,命令都会收到两次 SIGINT。某些信号(例如 SIGSTOP 和 SIGKILL)无法被捕获,因此不会转发给命令。一般来说,当您希望暂停 sudo 正在运行的命令时,应使用 SIGTSTP 而不是 SIGSTOP。