Bash / ZSH: отмена «отречься»


30

Есть ли способ «присоединить» процесс к таблице заданий оболочки после того, как он «отрекся»?

Редактировать: $ SEARCHENGINE полностью меня подводит. Не выглядит слишком хорошо.

Ответы:


16

Учитывая то, как работает Linux и владелец процесса, я боюсь, что на самом деле невозможно переуступить процесс без помощи процесса принятия.

Родитель может «отречься» от ребенка, который затем «усыновляется» процессом с именем «init». Система безопасности не позволяет кому-либо захватывать чужие процессы. Когда вы отрекаетесь от этого, процесс становится чьим-либо (инициатором) для управления. Вы, как «пользователь», все еще можете убить процесс, но вы не можете его вернуть. Попытка принудить init вернуть ваш процесс вряд ли сработает, так как init даже не читает почту.

Как бы странно это ни звучало, все сводится к ответу «Не делай этого!».


1
Это не может быть правдой: родительский процесс не может привести к усыновлению ребенка, кроме как путем выхода. Поведение, которое вы описываете, должно запускаться дочерним процессом (или ядром, которое делает это автоматически, если родитель умирает). Процесс не может усыновить ребенка добровольно, но он также не может отказаться от него.
Жиль "ТАК - перестань быть злым"

1
Мои извенения. Моя вина. Слишком сильно упрощено. Запустил источник bash снова, bash все еще сохраняет владение, но запрещает передачу sighup дочернему процессу. Так что МОЖЕТ быть возможно вернуть его обратно, но он не встроен в bash (пока). По какой-то причине я застрял на пожинании урожая сирот и зомби.
Lornix

@lomix да, но когда вы выходите из оболочки, от которой вы отказались, то она получает ppid, равный 1., поэтому ваши рассуждения верны. кто отрекается, если они не
собираются

1
Извините, но этот ответ неверен. Просто используйте reptyr(см. Мой ответ для примера использования).
Кристиан Питч

18

Хотя я полагаю, что это никому не поможет в печальной ситуации, когда вы отреклись от неправильного процесса, если бы вы исключили из вашего рабочего процесса отречение и заменили его следующим:

https://github.com/nelhage/reptyr

Вы сможете переписать любой процесс (т.е. переместить его внутрь экрана).


2
Что ж, я вернул свой отрицаемый процесс vim с reptyr, так что он работал так же, как и утилита unown, которую я искал.
Хловдал

Вы правы, @hlovdal: Этот ответ наполовину неверен. reptyrэто решение, но нет необходимости прекращать использование disown. Для наглядности я написал новый ответ.
Кристиан Питч

11

Все, что вам нужно, это reptyr. Он работает на GitHub и был упакован для Debian начиная с Wheezy, и, вероятно, также для других дистрибутивов GNU / Linux. Он будет отображать приоритет вашего процесса в текущем терминале, если вы вызовете его с идентификатором процесса (PID). Так, например:

pgrep -f DISOWNED_PROCESS  # to find out the PID of the disowned process
reptyr PID                 # insert this PID here

2
(sudo apt-get install reptyr) Затем получил это с первой попытки: «Ядро отказало в разрешении при подключении. Если ваш uid совпадает с целевым, проверьте значение / proc / sys / kernel / yama / ptrace_scope. Для получения дополнительной информации см. /etc/sysctl.d/10-ptrace.conf "Я изменил значение в обоих местах с 1 на 0, и это сработало. Я протестировал процесс отречения и репликации от того же пользователя (ноутбук ipython на Ubuntu 14.04 LTS). Возможно, это нормально для разработки в изолированной среде ... но не уверен, что это повлияет на конечную безопасность. Может быть, кто-то с опытом может
присоединиться

1

Простите, нет. В принципе, это было бы возможно, так как отмена просто изменяет некоторое внутреннее состояние оболочки - она ​​в основном удаляет идентификатор процесса из списка и может быть возвращена без особых хлопот (вам нужно быть немного осторожнее при тестировании, что обновленный pid находится в правильном сеансе, но это не является непреодолимым). Но ни одна из обычных оболочек (bash, ksh, tcsh, zsh), кажется, не имеет способа добавить заново. (Хотя с Zsh вы можете написать на jobstates, jobdirsи jobtextассоциативные массивы, я не знаю , сколько вы можете достичь таким образом.)

Если вы хотите, чтобы оболочка отправляла сигналы в отмененный процесс, как это делается для его собственных подпроцессов, вы можете написать задание-заглушку, которое ждет, пока не получит сигнал и не отправит тот же сигнал в отложенный процесс. Вы можете отправить SIGSTOPи SIGCONTв отрешенный процесс для имитации Ctrl+ Zи bg. Ничто из этого не будет таким удобным, как повторное владение.


0

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


6
Обстоятельства таковы: вы отказываетесь от неправильного процесса и хотите вернуть его обратно.
2010 г.,

1
Ах. Сильнее. Экран должен быть запланирован.
Скотт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.