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.