Чи можу я ногуп / екранувати вже розпочатий процес?


260

Я роблю кілька тестових запусків тривалих сценаріїв міграції даних через SSH. Скажімо, я починаю виконувати сценарій близько 16:00; зараз, 18 вечора котиться, і я проклинаю себе за те, що не роблю цього всього screen.

Чи є спосіб "заднім числом" nohupпроцесу чи мені потрібно залишати комп'ютер в Інтернеті на всю ніч? Якщо неможливо приєднати screenдо / nohupпроцесу, який я вже почав, то чому? Щось із тим, як взаємодіють процеси батька / дитини? (Я не прийму відповідь "ні", яка хоча б не стосується питання "чому" - вибачте;))


4
Щойно побачив цікавий пост у блозі про disown. blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the
ojrac

Відповіді:


212

Якщо ви використовуєте Bash, ви можете запустити disown -h job

відхреститися

disown [-ar] [-h] [jobspec ...]

Без опцій кожен спецзапис видаляється з таблиці активних завдань. Якщо -hпараметр заданий, завдання не видаляється з таблиці, а позначається так, що SIGHUP не надсилається до завдання, якщо оболонка отримує SIGHUP. Якщо jobspec відсутня, і не надається -aні -rопція, ні параметр, використовується поточне завдання. Якщо не вказано жодних робочих місць, -a опція означає видалити або позначити всі завдання; -rваріант без jobspec аргументу обмежує операцію виконання завдань.


Чудовий; Я сподівався, що щось подібне виявиться.
ojrac

7
Життя може бути несправедливим. gharper і я публікували це приблизно в один і той же час :)
serverhorror

4
Ви мій герой
Томас Дігнан,

9
відхрещення не характерне для баш. Це також в zsh, ksh93, ...
Phil P

2
Я виявив, що ви насправді повинні використовувати, disown %1якщо 1 - це taskpec, на відміну від fg або bg, де ви просто використовуєте bg 1 serverwatch.com/tutorials/article.php/3935306/…
mltsy

81

Використовуйте рептирій

З ПРОЧИТАННЯ:

reptyr - A tool for "re-ptying" programs.
-----------------------------------------

reptyr is a utility for taking an existing running program and
attaching it to a new terminal. Started a long-running process over
ssh, but have to leave and don't want to interrupt it? Just start a
screen, use reptyr to grab it, and then kill the ssh session and head
on home.

USAGE
-----

  reptyr PID

"reptyr PID" will grab the process with id PID and attach it to your
current terminal.

After attaching, the process will take input from and write output to
the new terminal, including ^C and ^Z. (Unfortunately, if you
background it, you will still have to run "bg" or "fg" in the old
terminal. This is likely impossible to fix in a reasonable way without
patching your shell.)

Кілька публікацій блогу від її автора:


Я збираюся дотримуватися вбудованих інструментів (тобто відхилятися), але це не так гнучко, як рептир. +1
ojrac

22

Щоб вкрасти процес з однієї до вашої поточної, ви можете спробувати цей хак:

http://www.ucc.asn.au/~dagobah/things/grab.c

Для компіляції до поточних версій Linux / glibc потрібне певне переформатування, але воно все ще працює.


1
Винятково круто.
ojrac

16

Коли процес починається, STDIN, STDOUT і STDERR підключаються до чогось . Як правило, ви не можете змінити це, як тільки команда запущена. У випадку, який ви описуєте, це, мабуть, tty, пов'язане з ssh-сеансом. nohup майже просто так ...

command < /dev/null > nohup.out 2>&1

Тобто встановлює STDIN у / dev / null, STDOUT у файл та STDERR на STDOUT. Екран робить набагато складніші речі, пов’язані з налаштуванням TTys, які спрямовують на себе.

Я не знаю жодного способу заднім числом нохуп або екранізацію запущеного процесу. Якщо ви cd в / proc / $ pid / fd і бачите, на що вказують 0, 1 і 2.

Можливо, вам доведеться пощастити з відхиленням, але ні, якщо процес намагається зробити щось із STDIN, STDOUT або STDERR.


2
+1 за хороші коментарі. st (din | out | err) - друга половина проблеми, і я ціную поради, з чого почати шукати, наступного разу, коли я в цьому варенні.
ojrac

6
Ви насправді можете змінити його на більшості Unixes. Це огидний злом. Я це люблю. :) Що ви робите, це підключитись до процесу, використовуючи підтримку налагодження на зразок ptrace, а потім змусити процес викликати dup2 (), щоб знову підключити 0,1,2 до іншого файлового файлу.
Zan Lynx

2
так, ви можете змінити. Включає призупинення процесу (SIGSTOP) та зміну дескрипторів файлів для fd 0, 1, 2. Потім перезапуск (SIGCONT).
Майкл Мартінес

13

Кріопід - це подальша розробка автора grab.c, яка заморожує процес у файл, який ви потім запустите (всередині екрану), щоб відновити процес.


1
Приємно! Я намагався використовувати кріопід у дисертації свого магістра про міграцію процесів, але це не вдавалось працювати весь час, що б я не робив. Зрештою, мені довелося використовувати dynckpt із старовинною версією Linux. Ви, можливо, брали участь у розробці кріопіду? Я бачу, що ваше ім’я схоже на домен автора.
Джуліано

1
Я не задіяний у розробці, я просто знаю автора з університету. Наразі у нього немає часу на підтримку кріопіду, тому схоже, що деякі люди почали над ним працювати на сайті shareource.org/project/cryopid
TRS-80

12

Я можу дати вам лише просте "Ні" без того, чому для екранної частини я зацікавився б причиною того, який ти.

Однак ви спробували disown(вбудований баш)

~ $ echo $SHELL
/bin/bash
~ $ type disown
disown is a shell builtin
~ $ help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.

9

nohup на Solaris / OpenSolaris має прапор -p для nohup запущеного процесу - наприклад, дивіться сторінку Solaris 10 nohup man .


5

Нещодавно я побачив посилання на neercs , це екранна утиліта, побудована за допомогою libcaca, кольорової бібліотеки ascii-art. Серед інших функцій, він може похвалитися можливістю схопити існуючий процес і відредагувати його всередині сеансу neercs (екран).

Однак я не використовував його, тому не можу коментувати, працює він чи ні.


2

Я, мабуть, недоосмислюю це, тому сміливо виправляйте мене (я вже дізнався про відмову!) ... Чи не спрацює ctrl-Z та "bg", щоб принаймні привести процес у фоновий режим? Або це ключове питання, яке ви все ще хочете побачити STDOUT, поки він працює?


1
Це все-таки вб'є процес, коли власник tty гине, тому ОП потрібно залишити поле, де він ініціював виконання команди, чого він хоче уникнути
serverhorror

Гаразд, я це куплю. Дякую за пояснення. Тож відхилення -h пропозиції обов'язково виглядають набагато розумнішими, ніж мої :-)
Chris_K

1
Ви можете все ще зробити це, тільки після того, як ви повинні були б відректися -h: stackoverflow.com/a/625436/705198
AndrewPK

2

Якщо ви можете жити, не маючи можливості взаємодіяти з процесом і не заперечуєте проти завантаження випадкових модулів ядра, ви можете зробити гірше, ніж подивитися на Snoop . Як альтернатива, є пара інших проектів. Ось один injcode виклику, який може в основному робити те, що ви хочете робити.



1

Я хотів за допомогою nohup(або подібного) запустити linksбраузер командного рядка і приєднатись до нього після завантаження файлу з веб-сайту ASP.NET зі складним процесом аутентифікації та безліччю прихованого стану перегляду, що ускладнило його використання. з curl/ wget.

Нарешті я застосував, tmuxщо вирішив завдання просто чудово:

  1. Біжи tmux
  2. Запустіть додаток ( linksу моєму випадку) і залиште його працювати
  3. Закрийте сеанс SSH, додаток залишиться запущеним
  4. Пізніше підключіться з SSH до тієї ж машини і запустіть, tmux attachщоб повернути програму на екран

tmux чудовий - але, як і nohup чи екран, він працює лише у тому випадку, якщо ви його використовуєте перед запуском процесу. Це питання стосується тих часів, коли ви розумієте, що вам потрібен tmux після того, як ваш процес вже запущений.
ojrac

-1

Ви турбуєтесь про час закінчення сеансу? У такому випадку ви можете Ctrl-z і bg процес, а потім просто помістити щось, щоб зберегти сеанс живим, як "ping -t localhost" або "top".

Якщо ви хочете вийти з системи, то, боюся, я не можу додати до інших коментарів.


Це справа виходу.
ojrac

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