29

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

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

5 ответов5

18

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

https://github.com/nelhage/reptyr

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

16

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

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

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

9

Все, что вам нужно, это 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
1

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

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .