После-фактический удаленный nohup с tcsh

11

У меня есть экземпляр tcsh в xterm, который выполняет долгосрочный (недели?) Процесс. Сервер Xvnc, на котором он работает, вышел из-под сорняков; он потребляет 100% ресурсов процессора и не отвечает. (Это известная ошибка, и я знаю, что это невозможно исправить.)

Долгосрочный процесс в настоящее время блокируется на стандартный вывод.

Есть ли способ, которым я могу уничтожить основной процесс - tcsh, xterm и т. Д. - и сохранить этот долгосрочный процесс работающим?

(Пожалуйста, ответов нет screen. Я знаю. Это не мой процесс; это пользователь. Они не будут учиться.)

wfaulk
источник

Ответы:

17

Этот пост может помочь. Рекомендация:

  1. фоновый процесс (с помощью Ctrl-Z, затем bg )
  2. запустите disown -h% [jobid] (вероятно, bash-ism, так что вам придется переводить для tcsh)

Плохая новость , конечно, является то , что Б.Г. необходимо будет сделать в той же оболочке процесс выполняется в ... но ... это может быть уже в фоновом режиме .

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

Хм. Возможные хорошие новости - tcsh автоматически отключается :

Если tcsh завершает работу ненормально, при выходе из него автоматически отключаются задания, работающие в фоновом режиме.

Таким образом, если ваш долгосрочный процесс уже задним числом, уничтожение его родителя tcsh должно позволить его продолжить. Процесс теперь отключен от стартового терминала. (Если нет, см. «Плохие новости» выше.)

К сожалению, это не экран, поэтому реальное переподключение отсутствует. Вы можете подделать его с помощью GDB (опять же, по первой ссылке):

[...] с некоторыми грязными взломами, невозможно повторно открыть процесс 'stdout / stderr / stdin.

Таким образом, вы все равно можете создать пустое окно экрана (например, которое запускает сон).

А затем, например, используйте gdb для присоединения к процессу, выполните некоторые вызовы close (0),
вызов close (1),
вызов close (2),
вызов open ("/ dev / pts / xx", ...)
call dup (0)
call dup (0)
отсоединить

Результат процесса будет показан на экране. Он не будет подключен к этому экранному терминалу, поэтому, например, [sic] убьет команду «сна», а не процесс, но этого может быть достаточно для OP.

Интересно, не должно ли быть в этом процессе "call dup (1)" и "call dup (2)" ...

шарлатан
источник
Да, это процесс переднего плана, так что, я думаю, я облажался.
wfaulk
Да уж. но, как вы сказали, это не ваш процесс, не ваша вина. извини, ты застрял в беспорядке, правда.
Квик-кихот
2
Это полностью спасло мою задницу. Я столкнулся с той же проблемой, о которой писал вначале, а именно с тем, что процесс блокировался на STDOUT, когда X-сервер (и, я полагаю, xterm между ними) вклинился. Оказывается, мне не нужно было ничего делать, кроме как закрывать STDOUT. Этот вывод не имеет значения; реальные данные находятся в файле журнала где-то. Таким образом, я смог подключиться с помощью gdb, запустить «call close (1)», а затем «cont», и он снова движется. Спасибо!
wfaulk
да! интересно. что разморозить все? странность. рад, что это помогло!
Квик-кихот
2
Возможно, стоит отметить, что отправка "Ctrl-Z" в процесс переднего плана и отправка SIGSTOP на его pid - это одно и то же. (SIGCONT запускает процесс снова.) Я не знаю, будет ли это полезно для других в той же ситуации или нет, но в моем быстром тестировании отправка SIGSTOP, после которой SIGCONT дублирует «Ctrl-Z» и затем bg.
wfaulk
3

Эти вопросы относятся к программе под названием Cryopid, которая может вам помочь. У меня нет никакого опыта с этим, как бы то ни было.

Перемещение процесса между хостами

Перемещение xterms между X сессиями

Nohup и просмотрите процесс

Приостановлено до дальнейшего уведомления.
источник
CryoPID звучит очень аккуратно, но у меня было семейство процессов, и оно не поддерживает зависание и возобновление нескольких процессов, по крайней мере пока.
wfaulk