Как я могу отрицать рабочий процесс и связать его к новой экранной оболочке?

file_size_kb=`du -k "$filename" | cut -f1`

Проблема с использованием stat это, это - GNU (Linux) расширение. du -k и cut -f1 указаны POSIX и поэтому портативные к любой системе Unix.

Солярис, например, поставлется с ударом, но не с stat. Таким образом, это не совсем гипотетически.

ls имеет подобную проблему в этом, точный формат вывода не указан, так парсинг его вывода не может быть сделан портативно. du -h также расширение GNU.

Придерживайтесь портативных конструкций, если это возможно, и Вы сделаете чью-то жизнь легче в будущем. Возможно, Ваше собственное.

162
21.01.2016, 20:59
8 ответов

Использование GNU screen Ваш лучший выбор.

Выполнение экрана "Пуск", когда Вы сначала входите в систему - я работаю screen -D -R, выполните свою команду, и или разъедините или приостановите ее с CTRL-Z и затем разъединение с экрана путем нажатия CTRL-A затем D.

Когда Вы входите в машину снова, снова соединяетесь путем выполнения screen -D -R. Вы будете в той же оболочке как прежде. Можно работать jobs видеть приостановленный процесс, если Вы сделали так и работали %1 (или соответствующее задание #) к переднему плану это снова.

87
27.01.2020, 19:28
  • 1
    , Ничего себе, я не могу верить ответу Экрана GNU, в настоящее время является оцененным самым низким. Я пропускаю что-то? –  Faheem Mitha 21.03.2011, 07:55
  • 2
    Возможно! Походит на лучшее мне. –  Andrew Yochum 21.03.2011, 18:35
  • 3
    При Оглядывании назад это ясно, кажется, самое безболезненное решение, если можно запланировать соответственно и запустить процессы из экранной среды. Так или иначе я сделал это официальным ответом! –  levesque 08.07.2012, 03:48
  • 4
    я думаю, что это не отвечает на вопрос. Вопрос начинается, "У меня есть выполнение программы". Этот ответ предполагает, что еще не выполняет … –  Anko 16.04.2015, 12:25

Можно отменить “владение” программы от оболочки с disown встроенный:

# press Ctrl+Z to suspend the program
bg
disown

Однако это только говорит оболочке не отправлять a SIGHUP предупредите к программе, когда оболочка выйдет. Программа сохранит любое соединение, которое она имеет с терминалом, обычно как стандартный вход, потоки вывода и потоки сообщений об ошибках. Нет никакого способа повторно прикрепить тех, которые к другому терминалу. (Экранные работы путем эмуляции терминала для каждого окна, таким образом, программы присоединены к экранному окну.)


Возможно повторно прикрепить filedescriptors к другому файлу путем присоединения программы в отладчике (т.е. использование ptrace) и то, чтобы заставлять это звонить open, dup и close. Существует несколько инструментов, которые делают это; это - хитрый процесс, и иногда они будут разрушать процесс вместо этого. Возможности включают (ссылки, собранные от ответов до того, Как я могу отрицать рабочий процесс и связать его к новой экранной оболочке? и Могу я nohup/screen уже запущенный процесс?):

114
27.01.2020, 19:28
  • 1
    disown удаляет процесс из списка управления заданиями. –  ctrl-alt-delor 15.04.2015, 17:39
  • 2
    Почему нет disown -h? –  Cees Timmerman 17.06.2015, 18:18
  • 3
    @CeesTimmerman, Который оставляет задание в таблице задания оболочки, но каково преимущество этого? –  Gilles 'SO- stop being evil' 17.06.2015, 18:20
  • 4
    @Gilles: таким образом, Вы можете все еще fg или kill это, и видит, заканчивается ли это самостоятельно. –  Peter Cordes 11.08.2015, 23:47
  • 5
    Какие упомянутые утилиты работают с группой процессов (например. bzcat a.bz2 | grep text)? Человек для reptyr говорит, что это не поддерживает перемещение процессов с детьми. –  dma_k 18.10.2015, 12:17

Существует также маленькая утилита, названная крысиной, который позволяет Вам повторно прикрепить запускающие программы к другому терминалу.

21
27.01.2020, 19:28

Я регулярно не использую его, но neercs утверждает, что поддерживал это. Это - a screen- как программа с разными необычными функциями как лучшее управление областью, но главное это предлагает, способность импортировать процесс в область

19
27.01.2020, 19:28
  • 1
    Интересный. Это действительно ведет грязную игру (ptrace), но это только управляет дескрипторами файлов, это разветвляет процесс. Это может захватить find /, но разрушенный интерактивный удар. –  Gilles 'SO- stop being evil' 14.11.2010, 00:20
  • 2
    @Gilles, который я не могу помнить, как он пошел, когда я попробовал, но это не имеет большой репутации, мне говорят, что он приводит к сбою довольно регулярно –  Michael Mrozek♦ 14.11.2010, 00:25

Чтобы переместить процесс между терминалами или повторно прикрепить отрицаемый, можно использовать, например, reptyr.

66
27.01.2020, 19:28
  • 1
    Да это сохранило его, Спасибо! я считал веб-сайт автора, как это работает лучше, чем подобные или более старые инструменты, например, для ncurses программ. –  Marcos 08.03.2012, 17:19
  • 2
    Это является потрясающим; это должно решить затруднительное положение друга постоянной потери ее работы путем выполнения его прямо в ssh и затем необходимости сесть в поезд. "Ой, забыл использовать экран. Снова". –  Adam Katz 16.01.2015, 07:13
  • 3
    +1, Хотя принятый screen ответ, конечно, идеален, он на самом деле не отвечает на вопрос, который конкретно запрашивает способ переместить в настоящее время рабочий процесс в screen и т.п. Также см. этот ответ: serverfault.com/a/284795 –  toxefa 19.04.2015, 00:15

Мое любимое решение использует tmux, Вы могли отсоединить сессию и повторно прикрепить ее в другом терминале.

Когда Вы отсоединились от предыдущей сессии, можно безопасно закрыть терминал; позже используйте tmux attach возвращаться к сессии, даже если Вы вышли из системы.

28
27.01.2020, 19:28
  • 1
    также можно совместно использовать встречу с другом и использовать несколько окон и областей и настолько больше! любите его ^_^ –  igor 24.09.2013, 11:03
  • 2
    Это работает также! $ sudo ssh last-call-2 Password: $ sudo ssh -o "BatchMode=yes" last-call-2 Permission denied (gssapi-keyex,gssapi-with-mic,publickey,password,keyboard-interactive). ---------121 пример--------72394----использования? –  Vitaly Zdanevich 20.02.2016, 02:55

Если вы хотите просто поставить его на паузу и перезапустить после этого, вы можете использовать [11777] kill[11778] с сигналом [11779] STOP[11780] или [11781] CONT[11782].

Сначала узнайте PID процессов с помощью

, а затем отправьте сигналы на этот PID, перечисленный в списке процесса

9
27.01.2020, 19:28

"Injcode" от ThomasHabets, кажется, именно то, что мне нужно:

https://github.com/ThomasHabets/injcode

Программа Injcode позволяет вставлять произвольный код в работающий процесс , знали ли вы заранее и запускали ли вы screen или tmux

Из README:

Пример 1: переместите irssi с одного терминала на другой

Возможно, переместите его на экран.

Сначала запустите irssi на одном терминале.

Запустите команду Injcode в другом терминале: $ injcode -m retty

Irssi теперь нужно переместить во второй терминал, включая новый управляющий терминал .

9
27.01.2020, 19:28

Теги

Похожие вопросы