bash- Control-C поведение (^C) / гксудо против судо

Это о том, как нажатие клавиш 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 имеет эту потенциально полезную информацию:

Также обратите внимание, что библиотека решит, следует ли ей использовать su или sudo в качестве бэкэнда с помощью ключа gconf / apps / gksu / sudo-mode, если вы вызываете команду gksu. Вы можете принудительно запустить бэкэнд с помощью команды 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 + C sudo Убьют gedit, Но также, если я закрою терминал, sudo а также gedit все еще продолжай бежать.

Так, sudo не волнует, если программа, которая его вызывала (gksu или терминал) убивается, он и все, что он начал, тоже работает.


И эти выдержки из man sudo тоже может быть полезным:

Модель процесса
Когда sudo запускает команду, она вызывает fork(2), устанавливает среду выполнения, как описано выше, и вызывает системный вызов execve в дочернем процессе. Основной процесс sudo ожидает завершения команды, затем передает статус завершения команды функции закрытия политики безопасности и завершает работу.

Обработка сигналов
Когда команда запускается как дочерний элемент процесса sudo, sudo будет передавать полученные сигналы команде. Если команда не выполняется в новом pty, сигналы SIGHUP, SIGINT и SIGQUIT не передаются, если они не отправлены пользовательским процессом, а не ядром. В противном случае команда будет получать SIGINT дважды каждый раз, когда пользователь вводит control-C. Некоторые сигналы, такие как SIGSTOP и SIGKILL, не могут быть перехвачены и, следовательно, не будут переданы команде. Как правило, вместо SIGSTOP следует использовать SIGTSTP, если вы хотите приостановить выполнение команды sudo.

Другие вопросы по тегам