Отключить процесс, который не был запущен из терминала

Я запускаю emacs из моего скрипта инициализации при входе в систему. Время от времени я случайно приостанавливаю его с помощью ctrl + z , и я не знаю, как с этим справиться.

Если бы я начал с терминала, jobs и fg сделали бы свое дело, но в этом случае нет терминала для запуска.

Я вижу запущенный процесс:

gauthier@sobel:~/data $ ps aux | grep emacs
gauthier  2932  0.0  0.6 565500 112540 ?       Sl   Apr14   0:11 emacs
gauthier 15189  0.0  0.0  11744   932 pts/2    S+   15:54   0:00 grep --color=auto emacs
1
задан 15 April 2015 в 16:55

2 ответа

Emacs не был действительно временно отстранен.

Когда мы обнаружили посредством поиска и устранения неисправностей, emacs не был действительно приостановлен. Приостановленное шоу процессов T как часть их состояния при просмотре через ps, тогда как в Вашей ситуации emacs показал S, который просто означает, что это ожидало на событии (в этом случае, ожидая на взаимодействии с пользователем).

Как объяснено в разделе "PROCESS STATE CODES" man ps:

               S    interruptible sleep (waiting for an event to complete)
               T    stopped, either by a job control signal or because it is
                    being traced

Когда процесс приостановлен, который считают сигналом управления заданиями, начиная с приостановки процессов, прежде всего, сделан как часть управления заданиями (с & в конце команды, Ctrl+Z, выпущенный в терминале, и jobs окружите встроенный). Посмотрите ps сама страница справочника для документации других кодов состояния, D, R, W, X, и Z.

Emacs был представлен в виде значка, не временно отстранен. Когда Ctrl+Z выпущен к приоритетному процессу в терминале, он заставляет процесс быть приостановленным. Но Вы нажали Ctrl+Z в то время как в GUI emacs окно. Ctrl+Z не приостанавливает программы при уступании это дорогу - например, во многих приложениях (таких как Firefox и LibreOffice), Ctrl+Z является нажатием клавиши для отмены.

Когда Вы смогли подтвердить при использовании emacs через графический интерфейс, Ctrl+Z является сочетанием клавиш, чтобы представить в виде значка (т.е. минимизировать) окно или к deiconify (т.е. восстановление) он, если он уже представляется в виде значка. Конечно, необходимо было выбрать представленное в виде значка окно к deiconify это с Ctrl+Z, который кажется, что менеджер окон не может поддерживать.

Обратите внимание, что при нажатии Ctrl+Z, в то время как в окне терминала, маловероятно, что emacs самостоятельно прерывает его и приостанавливает себя. Скорее Ctrl+Z, выпущенный в терминале обычно, приостанавливает обработанный, и Ctrl+Z, выпущенный в окне GUI обычно, не делает.

Так как Вы сказали, что "все еще интересуетесь знанием, как не приостановить процесс от терминала" и объяснение того, как знать, приостановлен ли процесс действительно (и когда Ctrl+Z делает и не приостанавливает процесс), делает для разумного введения в ответ об этом, я решил посвятить остаток от этого ответа на обращение к той части вопроса.

Возобновление приостановленных процессов от другого терминала

Если у Вас есть доступ к терминалу управления приостановленной программы, jobs, fg, и bg builtins позволяют Вам просматривать и возобновлять его. Если у Вас нет доступа к терминалу управления программы и всему, что необходимо сделать, возобновить процесс, но не дать ему вход или считать его вывод, на терминале, можно отправить процессу SIGCONT, как детализировано в ответе zhongfu. Это, вероятно, что Вы сделали бы, если графическая программа была приостановлена, и Вы не могли бы возобновить его от ее терминала управления. Это вызвано тем, что основной способ, которым мы взаимодействуем с большинством приложений для GUI большую часть времени, через их графический UIs, а не через терминал.

Однако, если необходимо отсоединить стандартные потоки процесса от его исходного терминала и повторно прикрепить их к другому терминалу - то есть, для возобновления приостановленного процесса, и взаимодействовать с ним в другом терминале от того он был запущен в - который не так прост.

  • Вам главным образом было бы нужно это, если бы это была программа командной строки, разработанная для взаимодействия с пользователем, прежде всего, через терминал, а не через некоторый другой механизм как GUI или локальный веб-сервер. Например, Вы будете должны, намного более вероятно, сделать это для emacs -nw чем для GUI emacs.

Повторное прикрепление процесса к другому терминалу, если Вы запланированный заранее

При предупреждении этой потребности, когда Вы запускаете программу, можно избежать его в целом путем запуска процесса в оконечном мультиплексоре, а не обычном терминале. screen и tmux сделайте это; посмотрите man screen и man tmux для деталей. (См. также byobu.) Процесс, запущенный в оконечном мультиплексоре, не подключенном непосредственно к терминалу, через который Вы взаимодействуете с ним, но вместо этого к псевдо терминалу, обеспеченному мультиплексором.

  • Например, Вы могли работать screen emacs в одном терминале, затем более позднее отсоединение это от того терминала путем нажатия Ctrl+A, сопровождаемого Ctrl+D и открытого это на другом терминале (или тот же) путем выполнения screen -r. Или, если Вы никогда не отсоединяли его, формируют первый терминал, Вы отсоединяете его оттуда и повторно прикрепляете его к текущему терминалу с screen -rd.

Повторное прикрепление процесса к другому терминалу, если Вы не запланировали заранее

Если Вы не запускали свою программу в оконечном мультиплексоре и потребности отсоединить его из ее оригинала и присоединить его к новому, это обычно возможно, хотя нетривиальный с утилитами, установленными в Ubuntu по умолчанию. Это может быть сделано путем открытия и управления процессом в отладчике.

К счастью, утилиты были записаны, с которым это может быть сделано легко - или по крайней мере предпринято легко. Я предлагаю reptyr. (См. также injcode, neercs, и сравнение трех на reptyr странице.) readme файл Reptyr на reptyr странице GitHub дает информацию об использовании. На Ubuntu, чтобы загрузить и создать reptyr, выполняют его testsuite и устанавливают его, можно использовать эти команды:

# Install build dependencies and set up /usr/local/src for administrators.
sudo apt-get update && sudo apt-get install build-essential git python-pip
pip install pexpect
cd /usr/local/src && sudo chgrp sudo . && sudo chmod g+w,+t .

# Retrieve, configure, build, test, and install reptyr.
git clone https://github.com/nelhage/reptyr.git && cd reptyr
make && sudo make test install

Можно заметить, что я делаю test будьте нацелены как корень с sudo. Обычная лучшая практика должна создать и протестировать программное обеспечение как обычного пользователя и поднять для укоренения только для установки его. Однако в конфигурации Ubuntu по умолчанию, reptyr не работает, когда выполнено некорневым пользователем. Это вызвано тем, что reptyr управляет дескрипторами файлов процесса путем присоединения к процессу как отладчик, но как средство защиты некорневые процессы запрещаются от процессов отладки, которые не являются их потомками.

Когда Вы на самом деле используете reptyr команда, Вы не выполните его с sudo. Вместо этого Вы захотите выполнить reptyr как тот же пользователь, который владеет процессом от терминала, принадлежащего тому пользователю. (Мог бы быть способ заставить это работать, не делая этого, но это только работало на меня тот путь.)

Используя reptyr на Ubuntu

Разрешение процессов отладить непотомков, принадлежавших тому же пользователю, вероятно, вызовет проблемы, только если под управлением программа успешно используется (или если у Вас есть вредоносное программное обеспечение). Один способ позволить reptyr работать при хранении угрозы безопасности относительно низко состоит в том, чтобы позволить его только, когда необходимо выполнить reptyr - который является, вероятно, надо надеяться, редким возникновением - и повторно отключите его впоследствии.

Так, предположите запуск неграфического экземпляра Emacs (в недоступном терминале):

emacs -nw

Это может или не может быть приостановлено. От другого терминала, изменения ptrace_scope от 1 до 0 для разрешения процессов процессам отладки, которые не являются их потомками:

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

Затем выполненный reptyr, передача PID процесса как аргумент, чтобы попытаться отсоединить его от старого терминала и присоединить его к новому:

reptyr PID

Можно найти PID в выводе ps x или с pgrep или pidof. Если существует только один emacs выполнение, можно найти PID и передать его reptyr в единственной команде:

reptyr $(pidof emacs)

Я нашел, что это обычно работает, но иногда не делает. Если reptyr шоу никакой вывод вообще, Вам, вероятно, придется нажать Ctrl+Z для использования программы. (Я не знаю почему то есть, но выполнение ps показывает, что ничто не приостановлено или не приостановлено, когда я нажимаю Ctrl+Z в этой определенной ситуации, таким образом, я подозреваю, что это имеет отношение к взаимодействию между reptyr и средствами управления заданиями моей оболочки.)

Управление заданиями не может быть полностью функциональным с повторно прикрепленным процессом; например, Вы не можете всегда мочь приостановить его с Ctrl+Z.

После того, как Вы будете сделаны с reptyr, можно установить ptrace_scope назад к 1 для безопасности:

echo 1 | sudo tee /proc/sys/kernel/yama/ptrace_scope

Это легче и более надежно, чтобы запланировать заранее, если это возможно. Если терминал, на котором Вы запускаете интерактивную программу, мог бы стать недоступным, лучше использовать оконечный мультиплексор как screen или tmux (как детализировано выше).

1
ответ дан 16 April 2015 в 02:55

Можно работать

kill -SIGCONT [pid]

или

killall -SIGCONT [process name]

для возобновления процесса [es] с указанным PID или именем процесса.

2
ответ дан 16 April 2015 в 02:55

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

Похожие вопросы: