Как восстановить процесс отречения?

12

Подобно многим предыдущим вопросам, я обнаружил, что выполняю работу, которую хотел бы запустить на экране. Я был вынужден отказаться от процесса, потому что мне нужно было отключиться. Теперь, когда я снова подключился, я вижу, что процесс все еще работает. Как я могу "восстановить" процесс, чтобы я мог видеть его вывод и дать ему ввод?

Этот вопрос отличается от простого перемещения запущенного процесса на экран тем, что он включает повторное открытие потерянных дескрипторов stdin / out / err.

Sparr
источник

Ответы:

6

Это повторяющийся вопрос - см. Перемещение уже запущенного процесса на Screen , который указывает на retty , который является самоописанным ужасным взломом, реализующим то, что я всегда догадывался, возможно, но никогда не пытался: он находит fd 0, 1 и 2 (стандартный ввод, вывод и ошибка соответственно) для процесса и присоединения к ним, как ужасного аберрантного паразита, которого не должно быть.

mattdm
источник
Я не знал об этой программе - хотя, по правде говоря, ее не стоит использовать! Хороший ответ, независимо.
Андрей М.
6

Отказываясь от процесса, вы фактически говорите, что хотите, чтобы он игнорировал SIGHUP, выданные терминалом. Как только вы закроете сеанс (скажем, bash), этот процесс станет собственностью init. Поэтому, когда вы говорите, что хотите переуступить процесс после того, как отказались от владения, вы говорите, что хотите отобрать право собственности у другого процесса - который не реализован, и на то есть веская причина. Это просто невозможно сделать изящно в Linux.

Андрей М.
источник
1
Процессы не владеют другими процессами. Отказавшийся процесс все еще работает как вы.
Mattdm
Они делают, как только родительский сеанс был закрыт - как указано в его вопросе. Я обновил свой ответ, чтобы отразить это.
Андрей М.
Родительский процесс изменяется на init, но это отличается от владения. EUID и UID процесса остаются теми же, что и у исходного пользователя. В противном случае это может быть потенциально пригодным для использования, потому что у каждого пользователя внезапно появится способ запуска кода как другого пользователя, так и системного пользователя.
Mattdm
1
EUID / UID! = PPID. Я говорю о владении процессом, а не о разрешениях.
Андрей М.
Да, я думаю, что мы согласны обо всем, кроме значения термина «процесс владения». Это относится к идентификатору пользователя, с которым связан процесс, а не к его родительскому процессу. Возможно, путаница связана с командой, disownспецифичной для bash, которая, несмотря на название, на самом деле не имеет ничего общего с изменением владельца процесса.
Mattdm