4

Я запускаю процесс, запускаю его в фоновом режиме, затем выхожу из системы, затем снова вхожу в систему и хочу снова вывести процесс на передний план. Я посмотрел в "ps aux" для PID, но он не будет помещен на передний план с "fg ###". Какой правильный путь?

(Я использую одну и ту же учетную запись для обоих сеансов входа.)

2 ответа2

10

Наиболее распространенный способ сделать это, вероятно, с GNU Screen.

Screen - это полноэкранный оконный менеджер, который мультиплексирует физический терминал между несколькими процессами, обычно интерактивными оболочками.

В основном вы будете:

  • Убедитесь, что screen установлен. Как правило, это пакет ' screen ' в большинстве дистрибутивов Linux. Он установлен по умолчанию в Mac OS X.
  • Выполнить screen

альтернативный текст

альтернативный текст

  • Запустите программу, которую вы хотите «фон». Например, я начинаю отслеживать файл журнала:

альтернативный текст

  • Нажмите Ctl-a, d чтобы отсоединить экран.

  • Выйти, делать другие вещи, что угодно. Здесь я отправлю сообщение в журнал.

альтернативный текст

  • При повторном входе в систему введите screen -r чтобы заново подключить сеанс, который вы выполняли ранее. Здесь вы можете увидеть сообщение, которое я отправил в журнал (и более ранний тест тоже).

альтернативный текст

Многие считают, что Screen - это инструмент для опытных пользователей в Linux/Unix, и я склонен согласиться!

Для получения дополнительной информации об экране см. Его домашнюю страницу или эту статью Ars Technica.

4

AFAIK, нет прямого способа выдвинуть на первый план процесс, который был запущен и основан на другой оболочке. Однако есть несколько способов обойти это.

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

Уродливый хакерский способ - отсоединить его от терминала перед выходом из системы. В bash это делает disown -h %[jobid] ; другие оболочки, такие как tcsh, делают это автоматически для фоновых процессов при выходе из оболочки. (Получите $[jobid] , запустив команду jobs .) Вы не можете подключиться к процессу напрямую, но если все, что вам нужно, это процесс stdout/stderr/stdin, вы можете использовать GDB для имитации присоединения. Это частичный практический совет из этого источника (первоначально включенный в другой ответ):

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

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

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

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

Есть несколько способов заставить bash делать автоматическое отречение, но они включают шоптс или nohup или другие трюки bash, чтобы избежать автоматического SIGHUP. bash не так грациозен, как tcsh в этой области, и вы должны заранее знать, что вам понадобится это для настройки опции. Перед запуском немного легче запомнить отключение на фоновой работе.

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