Удаленный nohup с помощью tcsh

7015
wfaulk

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

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

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

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

10

2 ответа на вопрос

16
quack quixote

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

  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 14 лет назад 0
Yeah. but like you said, it's not your process, not your fault. sorry you get stuck with the mess, tho. quack quixote 14 лет назад 0
Это полностью спасло мою задницу. Я столкнулся с той же проблемой, о которой писал вначале, а именно, что процесс блокировался на STDOUT, когда X-сервер (и, я полагаю, xterm между ними) вклинился. Оказывается, мне не нужно было ничего делать, кроме как закрывать STDOUT. Этот вывод не имеет значения; реальные данные где-то в лог-файле. Так что я смог подключиться с помощью gdb, запустить «call close (1)», а затем «cont», и он снова движется. Спасибо! wfaulk 14 лет назад 2
да! интересно. что разморозить все? странность. рад, что это помогло! quack quixote 14 лет назад 0
Нет, это должно быть dup (0). Вызов dup (0) берет fd 0 и копирует его в следующие свободные дескрипторы, которые бывают 1 и 2, если вы их закрыли ранее. dup2 (fd1, fd2) может быть более понятным написанием, если предположить, что вы можете вспомнить, какой источник, а какой пункт назначения (я никогда не смогу запомнить). Marius Gedminas 13 лет назад 0
Возможно, стоит отметить, что отправка "Ctrl-Z" в процесс переднего плана и отправка SIGSTOP в его pid - это одно и то же. (SIGCONT запускает процесс снова.) Я не знаю, будет ли это полезно для других в той же ситуации или нет, но в моем быстром тестировании отправка SIGSTOP с последующими дубликатами SIGCONT "Ctrl-Z" и последующим `bg `. wfaulk 9 лет назад 2
Вы можете повторно прикрепить через reptyr. См .: http://serverfault.com/questions/466129/restore-ssh-session/466183#466183 Olivier Dulac 8 лет назад 0
3
Dennis Williamson

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

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

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

Nohup и экранировать процесс

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