Как отречься от процесса из другой оболочки

Чтобы избежать остановки процесса при выходе из оболочки, вы можете запустить команду через nohup или screen . Также можно отменить существующий процесс с помощью следующих команд:

 mycommand # Press CTRL-Z bg disown %1 

Но это можно запустить только из текущей оболочки.

Я хотел бы сделать то же самое, используя другой сеанс shell / ssh (команда запущена в оболочке A , но disown запущена в оболочке B ).

Поместить процесс в фоновом режиме из другой оболочки возможно:

 # CTRL-Z can be done via kill -20 PID (SIGSTP) # bg can be done via kill -18 PID (SIGCONT) 

Но процесс все еще принадлежит первоначальной оболочке. Как отказаться от процесса из другой оболочки?

Я использую Linux 4.15

Это невозможно.

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

Это связано с тем, что disown влияет на список «заданий», которые программа оболочки поддерживает в пространстве памяти каждого отдельного процесса оболочки.

Оболочки (то есть управляющие заданиями) запоминают дочерние процессы, которые они разветвляли в своих внутренних «таблицах заданий», до тех пор, пока им не будет дано указание забыть о них из-за disown или пока дочерние процессы не завершатся, и shell не wait() для них и сообщил о прекращении “работы”. disown никак не влияет на состояние дочернего процесса. Это влияет на то, что делает shell.

Потому что он забывает о процессе disown

  • … Он больше не распознает завершение «задания», когда wait() сообщает ему об увольнении ребенка;
  • … Его больше не волнует, работает ли процесс, когда ему говорят exit / exit logout ; а также
  • … Он больше не отправляет сигнал зависания дочернему элементу, когда сам получает сигнал зависания (или, в случае некоторых программ оболочки, когда он выходит и знает, что это интерактивная shell входа в систему).

Оболочки не разделяют эти списки, и их нелегко получить (как уже упоминалось, без запуска отладчика и его подключения) из других процессов. Не существует механизма IPC или инструмента командной строки для доступа к ним, за исключением встроенной команды disown выполняемой внутри соответствующего процесса оболочки. (Вот почему это встроенная команда.)

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

Более того …

Поместить процесс в фоновом режиме из другой оболочки возможно.

На самом деле, это не то, что вы делали.

Понятия переднего плана и фона относятся к управляющему терминалу сеанса. В частности, существует одна группа процессов, известная управляющему терминалу, которая является приоритетной группой процессов . Остановка и продолжение процессов само по себе не переключает процессы между передним планом и фоном. Необходимо также обновить группу процессов переднего плана управляющего терминала. Процесс переднего плана находится только на переднем плане, поскольку является членом этой группы процессов переднего плана. Все остальные группы процессов в этом сеансе и, следовательно, процессы в этих группах процессов, находятся в фоновом режиме.

По иронии судьбы, вы не делали этого из другой оболочки. То, что вы делали, – это запуск исходного процесса оболочки для принятия действий . Он видит основной процесс остановки группы процессов переднего плана и в ответ корректирует группу процессов терминала переднего плана (обратно в свою собственную группу процессов).

SIGTSTP прочим, правильный сигнал – SIGTSTP .

дальнейшее чтение

  • В zsh, как я могу быстрее отказаться от процесса переднего плана?
  • Можно ли добавить процесс в список заданий в bash (например, чтобы отменить «отречься»)?

Если вы находитесь на Solaris, вы можете позвонить:

 nohup -p  

Это удаляет текущий управляющий терминал и подключает стандартный вывод к файлу в файловой системе.

Чтобы сделать это, вам нужна поддержка со стороны ядра (в данном случае файловой системы / proc). Поддержка программы nohup была добавлена ​​в Solaris в 2001 году. Если другие платформы могут подключать отладчики к запущенным процессам с других терминалов, эту функцию можно добавить.

КСТАТИ: Если вы посмотрите на оболочку, которая выполняла процесс раньше, вы можете увидеть сообщение об ошибке «нет дочерних элементов» от вызова wait () в оболочке.

В настоящее время я не знаю подобных конструкций на других платформах.