Как я могу перевести текущий запущенный процесс Linux в фоновый режим? [закрыто]

112

У меня есть команда, которая загружает файлы с помощью git на удаленный сервер из оболочки Linux, и это займет много часов.

Как я могу перевести эту запущенную программу в фоновый режим? Чтобы я все еще мог работать с оболочкой, и этот процесс тоже завершился?

Мираж
источник
Просто предположение, но вы пробовали ctrl + z или запускали свою команду таким образом; #command &
EralpB 03
Команда уже запущена, поэтому у меня нет другого варианта. Я не уверен, какую команду попробовать. я не хотел нарушать текущий процесс, поэтому я не экспериментировал с ним
Mirage
Тогда нам следует дождаться более профессионального ответа :) Я имел в виду, если бы у вас была возможность начать все сначала. (Команда и вещь)
EralpB 03
Принятый ответчик на этот вопрос объясняет три шага, которые необходимо предпринять: stackoverflow.com/questions/625409/…
Леонард Саерс,
Вы также можете просто открыть второй экземпляр putty и снова подключиться к серверу, чтобы получить другую оболочку. Хотя решение ctrl+zвелико.
Ela782 04

Ответы:

208

Приостановите процесс с помощью CTRL + Z, затем используйте команду, bgчтобы возобновить его в фоновом режиме. Например:

sleep 60
^Z  #Suspend character shown after hitting CTRL+Z
[1]+  Stopped  sleep 60  #Message showing stopped process info
bg  #Resume current job (last job stopped)

Подробнее об управлении заданиями и bgиспользовании на bashстранице руководства:

УПРАВЛЕНИЕ
ЗАДАНИЕМ Ввод символа приостановки (обычно ^ Z, Control-Z) во время выполнения процесса приводит к его остановке и возврату управления в bash. [...] Затем пользователь может управлять состоянием этого задания, используя команду bg, чтобы продолжить его в фоновом режиме, [...]. A ^ Z вступает в силу немедленно и имеет дополнительный побочный эффект, вызывающий отбрасывание ожидающих вывода и опережающего ввода.

bg [ jobspec ...]
Возобновить каждое приостановленное задание jobpec в фоновом режиме, как если бы оно было начато с &. Если спецификация задания не указана, используется представление оболочки о текущем задании .

РЕДАКТИРОВАТЬ

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

nohup [command] [-args] > [filename] 2>&1 &

например

nohup /home/edheal/myprog -arg1 -arg2 > /home/edheal/output.txt 2>&1 &

Чтобы просто игнорировать вывод (не очень разумно), измените имя файла на /dev/null

Чтобы установить сообщение об ошибке для другого файла, измените его &1на имя файла.

Кроме того: вы можете использовать jobsкоманду, чтобы просмотреть индексированный список этих фоновых процессов. И вы можете убить фоновый процесс, запустив kill %1или kill %2указав номер, являющийся индексом процесса.

Эд Хил
источник
Я попробовал, но поскольку он что-то выводит, он снова выходит на передний план с%, показывающим, сколько данных загружено
Mirage
Процесс будет записывать любой вывод в терминал, как вы дали ему указание сделать это в начале. Вам придется перезапустить его, чтобы получить вывод для записи в файл или /dev/null. См. Редактирование выше.
Эд Хил
значит, если процесс уже запущен, перенаправить вывод невозможно
Mirage
Да, в самом деле. Вы не можете воздействовать на процесс только на оболочку, из которой он запущен. Вы можете выполнить a, kill -9 <pid of your shellи тогда процесс все равно будет запущен, а вывод будет отброшен, но вам придется снова войти в систему, чтобы запустить новую оболочку.
Эд Хил
Вы также можете использовать эту disownкоманду, если вам нужно выйти из сеанса терминала и вы хотите, чтобы он продолжал работать.
Кирк Рериг