- Как запустить процесс в фоне Linux
- Как запустить процесс в фоне Linux
- Как перевести процесс в фоновый режим
- Работа процессов в фоне
- Выводы
- How can I put the current running linux process in background? [closed]
- 1 Answer 1
- Send a Process to Background Linux
- What is a Process?
- How to Run a Process in the Background
- 1: Using an Ampersand (&)
- 2: Using CTRL + Z, bg command.
- How to Show Background Processes
- How to Make a Process Persistent After Shell Dies
- Conclusion
- About the author
- John Otieno
Как запустить процесс в фоне Linux
Как правило, выполнение команд в терминале связано с одним неудобством — прежде чем приступить к вводу следующей команды, следует дождаться выполнения предыдущей. Это происходит, поскольку текущий процесс блокирует доступ к оболочке операционной системы и в таких случаях говорят, что команда выполняется на переднем плане. Что же делать, если нужно запустить несколько команд одновременно? Есть несколько решений. Первое и наиболее очевидное — открыть дополнительное окно терминала. Второе — инициировать выполнение команды в фоновом режиме.
Если какой-либо процесс происходит в фоновом режиме, это значит, что он не предусматривает взаимодействия с пользователем, следовательно, доступ к оболочке остается свободным. Прочитав эту статью, вы узнаете как запустить процесс в фоне Linux и что делать, чтобы их выполнение не прерывалось после закрытия терминала.
Как запустить процесс в фоне Linux
Для выполнения команды в фоновом режиме достаточно добавить в конце символ амперсанда (&):
В выводе терминала будут отображены порядковый номер задачи (в квадратных скобках) и идентификатор процесса:
В фоновом режиме можно одновременно запускать сразу два, три, четыре процесса и даже больше.
Работая в фоновом режиме, команда все равно продолжает выводить сообщения в терминал, из которого была запущена. Для этого она использует потоки stdout и stderr, которые можно закрыть при помощи следующего синтаксиса:
Здесь >/dev/null 2>&1 обозначает, что stdout будет перенаправлен на /dev/null, а stderr — к stdout.
Узнать состояние всех остановленных и выполняемых в фоновом режиме задач в рамках текущей сессии терминала можно при помощи утилиты jobs c использованием опции -l:
Вывод содержит порядковый номер задачи, идентификатор фонового процесса, состояние задачи и название команды, которая запустила задание.
В любое время можно вернуть процесс из фонового режима на передний план. Для этого служит команда fg:
Если в фоновом режиме выполняется несколько программ, следует также указывать номер. Например:
Для завершения фонового процесса применяют команду kill с номером программы:
Как перевести процесс в фоновый режим
Если изначально процесс был запущен обычным способом, его можно перевести в фоновый режим, выполнив следующие действия:
- Остановить выполнение команды, нажав комбинацию клавиш Ctrl+Z.
- Перевести процесс в фоновый режим при помощи команды bg.
Работа процессов в фоне
Запуск скрипта в фоне linux — это одно, но надо чтобы он ещё работал после закрытия терминала. Закрытие терминала путем нажатия на крестик в верхнем углу экрана влечет за собой завершение всех фоновых процессов. Впрочем, есть несколько способов сохранить их после того как связь с интерактивной оболочкой прервется. Первый способ — это удаление задачи из очереди заданий при помощи команды disown:
Как и в предыдущих случаях, при наличии нескольких одновременно выполняемых процессов следует указывать номер того, относительно которого будет выполнено действие:
Убедиться, что задачи больше нет в списке заданий, можно, использовав уже знакомую утилиту jobs -l. А чтобы просмотреть перечень всех запущенных процессов (в том числе и отключенных) применяется команда
Второй способ сохранить запущенные процессы после прекращения работы терминала — команда nohup. Она выполняет другую команду, которая была указана в качестве аргумента, при этом игнорирует все сигналы SIGHUP (те, которые получает процесс при закрытии терминала). Для запуска команды в фоновом режиме нужно написать команду в виде:
Как видно на скриншоте, вывод команды перенаправляется в файл nohup.out. При этом после выхода из системы или закрытия терминала процесс не завершается. Существует ряд программ, которые позволяют запускать несколько интерактивных сессий одновременно. Наиболее популярные из них — Screen и Tmux.
- Screen либо GNU Screen — это терминальный мультиплексор, который позволяет запустить один рабочий сеанс и в рамках него открыть любое количество окон (виртуальных терминалов). Процессы, запущенные в этой программе, будут выполняться, даже если их окна невидимы или программа прекратила работу.
- Tmux — более современная альтернатива GNU Screen. Впрочем, возможности Tmux не имеют принципиальных отличий — в этой программе точно так же можно открывать множество окон в рамках одного сеанса. Задачи, запущенные в Tmux, продолжают выполняться, если терминал был закрыт.
Выводы
Чтобы запустить скрипт в фоне linux, достаточно добавить в конце знак &. При запуске команд в фоновом режиме отпадает необходимость дожидаться завершения одной команды для того, чтобы ввести другую. Если у вас возникли вопросы, обязательно задавайте их в комментариях.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
How can I put the current running linux process in background? [closed]
I have a command that uploads files using git to a remote server from the Linux shell and it will take many hours to finish. How can I put that running program in background? So that I can still work on shell and that process also gets completed?
The command is already running so i dont have other option. I am not sure which command to try. i didn’t wanted to break the current process so i didn’t experimented it
We should wait a more professional answer then 🙂 I meant if you had the chance to start all over again. ( The command & thing)
The accepted answerer on this question explains the three steps which needs to be taken: stackoverflow.com/questions/625409/…
You can also just open a second instance of putty and connect to the server again to get another shell. Though the solution with ctrl+z is great.
1 Answer 1
Suspend the process with CTRL+Z then use the command bg to resume it in background. For example:
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)
More about job control and bg usage in bash manual page:
JOB CONTROL
Typing the suspend character (typically ^Z, Control-Z) while a process is running causes that process to be stopped and returns control to bash. [. ] The user may then manipulate the state of this job, using the bg command to continue it in the background, [. ]. A ^Z takes effect immediately, and has the additional side effect of causing pending output and typeahead to be discarded.bg [jobspec . ]
Resume each suspended job jobspec in the background, as if it had been started with &. If jobspec is not present, the shell’s notion of the current job is used.
To start a process where you can even kill the terminal and it still carries on running
nohup [command] [-args] > [filename] 2>&1 &
nohup /home/edheal/myprog -arg1 -arg2 > /home/edheal/output.txt 2>&1 &
To just ignore the output (not very wise) change the filename to /dev/null
To get the error message set to a different file change the &1 to a filename.
In addition: You can use the jobs command to see an indexed list of those backgrounded processes. And you can kill a backgrounded process by running kill %1 or kill %2 with the number being the index of the process.
Send a Process to Background Linux
When working with graphical desktop environments, we rarely worry about background processes. If we have a process running in the foreground, we can quickly spawn another terminal window and continue with our work.
However, if you are in a raw terminal shell such as SSH, you will often feel concerned about processes that occupy and block the shell until they are completed, especially on long-running jobs. That is where the concept of background and foreground processes comes into play.
This tutorial will discuss what background and foreground processes are, including creating and managing them in Linux.
What is a Process?
Allow me to start at the basic level: what is a process?
In Linux, a process is an instance of a program. Typically, this means any command or executable in a shell is a process.
There are mainly two types of processes:
Foreground processes are mainly typical applications that we launch and interact with them. An example would be the nautilus file manager in Gnome. In most cases, we can start foreground processes from the shell or the desktop environment.
On the other hand, background processes run in the background and require no input or interaction from the user. An example would be any typical Linux daemon.
How to Run a Process in the Background
Suppose we have a process that, while running, occupies the shell session and hinders us from executing commands until it exits.
For example, if we run the Firefox browser in the shell, it will occupy the session until process termination.
As you can see, as long as Firefox is running, the shell prompt is unavailable, and we cannot execute any more commands.
To solve this, we can do it two ways:
1: Using an Ampersand (&)
The first method is using the ampersand & sign. This tells the shell to run whatever command precedes the ampersand in the background.
In such a scenario, the process executes in the background and spawns as a new shell prompt allowing us to continue executing commands.
It also gives two numerical identifiers. The first one enclosed in square brackets is the Job ID, while the next one is the process ID.
2: Using CTRL + Z, bg command.
The next method you can use to put a process in the background is to use the shortcut CTRL + Z. This stops the process from blocking the shell. You can then use the bg command to push it to the background.
For example, start by launching Firefox as:
While the process is running, press CTRL + Z. This returns your shell prompt. Finally, enter the bg command to push the process in the background.
How to Show Background Processes
To view and manage processes in the background, use the jobs command in the shell. That will show the background jobs in the current terminal session.
An example output of background jobs:
To bring a process running in the background to the foreground, use the fg command followed by the job id.
For example, to bring the firefox job in the foreground, we use the command:
To put in the background again, press CTRL + Z followed by the bg command.
How to Make a Process Persistent After Shell Dies
When you are running processes in the background, and your shell session dies, all the processes associated with it terminate, which can be problematic, especially if it is an SSH session.
However, this is not too big an issue if you use a terminal multiplexer such as tmux or screen because, in that case, you can simply reattach the session.
However, if you run a shell session without a multiplexer, you can use the nohup command.
The nohup command is immune to hang-ups and can ignore the SIGHUP signal sent to a process.
Hence, if you run a command with nohup, it continues to run even if the shell session accidentally dies.
For example, to run Firefox with nohup, use the command:
This will run the process in the background as persist a shell terminate.
You can run a new terminal session and view the background jobs. You will see the process still running in the background.
Conclusion
In this tutorial, we discussed various ways to run and send processes to the background in Linux. We also covered how to bring a background process to the background and persist hang-up upon shell termination.
About the author
John Otieno
My name is John and am a fellow geek like you. I am passionate about all things computers from Hardware, Operating systems to Programming. My dream is to share my knowledge with the world and help out fellow geeks. Follow my content by subscribing to LinuxHint mailing list