10

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

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

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

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

2 ответа2

16

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

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

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

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

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

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

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

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

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

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

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

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

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

3

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

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

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

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

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