Післяданий віддалений ногуп з tcsh


11

У мене є екземпляр tcsh в xterm, який виконує тривалий (тиждень?) Процес. Сервер Xvnc, під яким він працює, вийшов у бур'яни; він споживає 100% процесора і не відповідає. (Це відома помилка, і я знаю, що її неможливо відновити.)

Зараз тривалий процес блокується на stdout.

Чи є якийсь спосіб я вбити основний процес - tcsh, xterm, будь-який інший - і продовжувати цей тривалий процес?

(Будь ласка, жодних відповідей щодо screen. Я знаю. Це не мій процес; це користувач. Вони не навчаться.)

Відповіді:


17

Ця публікація може допомогти. Рекомендація:

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

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

Дійсно погана новина в тому , що відхрестився виклик , можливо , буде потрібно зробити в одній оболонці. У такому випадку, так, ви накрутили. Але я не впевнений, можливо, root може змусити його відключити.

Хм. Можлива добра новина - tcsh робить відмову автоматично:

Якщо tcsh закінчується ненормально, він відключає завдання, що працюють у фоновому режимі, автоматично, коли він виходить.

Отже, якщо ваш довгостроковий процес вже є фоном, вбивство його батька tcsh повинно дозволити йому продовжуватися. Зараз процес відключений від стартового терміналу. (Якщо ні, див. "Погані новини" вище.)

На жаль, це не екран, тому реального підключення немає. Ви можете підробити це за допомогою gdb (знову ж таки, за першим посиланням):

[...] з деякими брудними хаками неможливо відновити процес 'stdout / stderr / stdin.

Таким чином, ви все ще можете створити порожнє вікно (наприклад, у режимі сну).

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

Вихід процесу буде виходити на екран. Він не був би приєднаний до цього екранного терміналу, тому, наприклад, [sic] вбивав би команду "сон", а не процес, але цього може бути достатньо для ОП.

Цікаво, чи не повинно бути в цьому процесі "дуб дзвінка (1)" і "дуб дзвінка (2)" ...


Так, це процес переднього плану, тому я гадаю, що я накручений.
wfaulk

Так. але, як ви сказали, це не ваш процес, не ваша вина. вибачте, що ви застрягли в безладі, тхо.
шарлатаний кіхот

2
Це повністю врятувало мою попу. Я зіткнувся з тією ж проблемою, про яку писав спочатку, яка полягала в тому, що процес блокується на STDOUT, коли сервер X (і, я думаю, xterm між ними) вклинився. Виявляється, мені не потрібно було нічого робити, крім закриття STDOUT. Цей вихід був неактуальним; реальні дані десь у логічному файлі. Тож мені вдалося з'єднатись з gdb, запустити "call close (1)", а потім "cont", і він рухається знову. Дуже дякую!
wfaulk

так! цікаво. що розморожує все? дивацтво. рада, що це допомогло Тхо!
шарлатаний кіхот

2
Можливо, варто зазначити, що надсилання "Ctrl-Z" на передній план і надсилання SIGSTOP на його pid - це те саме. (SIGCONT запускає процес знову.) Я не знаю, чи це було б корисно для інших, що знаходяться в тій же ситуації, чи ні, але, під час мого швидкого тестування, надсилання SIGSTOP з наступними дублікатами "Ctrl-Z" SIGCONT bg.
wfaulk

3

Ці питання стосуються програми під назвою Cryopid, яка може вам допомогти. Я не маю жодного досвіду з цим.

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

Переміщення xterms між X сеансами

Нохуп і екранування процесу


CryoPID звучить дуже акуратно, але в мене було сімейство процесів, і він не підтримує заморожування та відновлення декількох процесів, принаймні поки що.
wfaulk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.