Linux jobs
Linux jobs — системные задания, которые создаются пользователем в неограниченных количествах с возможностью переключения от одного к другому (с переднего на задний план и в обратном направлении).
Работа всегда производится с тем заданием, которое находится на переднем плане (foreground).
Linux jobs и команды по управлению ими
CTRL+Z работает с большинством процессов — переводит их в подвешенное состояние — останавливает и отправляет на задний план.
Все остановленные команды можно посмотреть введя в терминале jobs
Сейчас выполняются оба находясь при этом в фоне:
[1]- Stopped ping ya.ru
[2]+ Stopped top
Теперь можно переместить одно из заданий на передний план указав его номер
ping ya.ru
64 bytes from www.yandex.ru (93.158.134.3): icmp_seq=4 ttl=57 time=30.3 ms
64 bytes from www.yandex.ru (93.158.134.3): icmp_seq=5 ttl=57 time=29.0 ms
При переводе на передний план вывод производится в основной терминал, более ничего не меняется и задание выполняется в любом случае
Можно таким же образом вывести команду на задний план
Вывод команды таким образом продолжит быть присоединенным к терминалу, результат tail -f снова выведется в консоль как только в лог будет записываться информация (сэмулировать ситуацию можно перезапустив какой-либо демон подключившись к системе через другой терминал).
При выполнении в bg таким образом для нескольких команд их вывод в терминал будет смешиваться случайным образом, что может быть не очень удобно.
Если запустить команду со знаком амперсанда изначально она будет отображаться в выводе jobs как выполняющийся процесс со статусом Running.
Пример приведен на скриншоте:
Удалить процесс можно указывая его номер со знаком процента
Работа с Linux jobs является типичной операцией поручному управлению системными процессами. Читайте подробнее про управление процессами и ps aux
Работа с процессами (jobs, bg, fg, kill)
Программа представляет собой серию инструкций, которая указывает компьютеру, что делать. Запущенный экземпляр программы называется процессом, которым мы управляем. Linux, как и большинство современных ОС, является многозадачной операционной системой. Это означает, что многие процессы могут выполняться одновременно. Наряду с процессами, которые мы запускаем, в системе могут быть и другие пользователи.
fg, bg и jobs
Запущенный процесс в обычном режиме работает в режиме «foreground», т.е. — «на переднем плане» или, другими словами, «в приоритетном режиме». В таком режиме он принимает команды с управляющего терминала, в котором он запущен, и на него же выводит информацию. Кроме того, он делает недоступным командную строку. Для прекращения процесса «на переднем плане» необходимо нажать сочетание клавиш CTRL+C. Может быть, мы хотим запустить процесс, который займет немного времени и с радостью сделает это без нашего вмешательства. Например, обработка очень большого текстового файла. Тогда, мы можем запустить программу в фоновом режиме, а затем продолжить работу. Командная строка при этом станет доступна, но оставаясь в том же окне
Что бы запустить задачу в фоновом режиме — в конце команды необходимо добавить знак &. Отобразить список текущих задач можно командой jobs.
Либо — запустить её в обычном режиме, после чего нажать комбинацию CTRL+Z, отправив ей сигнал TSTR (сигнал остановки, генерируемый клавиатурой. Переводит процесс в фоновый режим). После этого — она появится в списке jobs с новым номером. При этом на экране, например, появится следующее сообщение:
Теперь, что бы продолжить её выполнение в фоновом режиме необходимо ввести команду bg (background). У задач в фоне имеется собственный номер, который всегда начинается с единицы (если нет других фоновых задач). Кроме того, jobs отображает состояние процесса — Running (Запущен), Stopped (Остановлен), Done (Завершен), Exit. Например, по окончании архивирования — статус задачи станет Done. ((bg — возобновляющийся процесс продолжает выполняться в фоне без ввода пользователем каких-либо команд с терминала.) В случае, когда мы имеем несколько задач, и хотим только определенные запустить в фоновом (или же переднем) плане, после соответствующей команды необходимо дописать номер задачи, например:
Если команду jobs запустить из каталога отличного от того, в котором была запущена сама задача — jobs укажет её wd — working directory. Так же, необходимо учитывать, что для каждого управляющего терминала номера задач в jobs будут независимы и начинаться с единицы.
Что бы вывести задачу из фонового режима — используется команда fg (foreground), которой можно либо передать номер задачи в качестве аргумента, либо — запустить без аргументов. В последнем случае — будет выведена задача, отмеченная знаком + в списке jobs, т.е. — последняя отправленная «в фон» задача. (fg — переместить фоновый процесс на передний план.) Например, в случае:
[1]- Запущен ./a.sh 2 & [2]+ Запущен ./a.sh 3 &
при вводе «fg» на передний план будет выведена задача с номером 2, а при вводе «fg 1» с номером 1. Стоит обратить внимание, что если задача выводит некоторые значения и вывод не настроен в другое окно, то в фоновом режиме команды в командной строке будут печататься «поверх». Важно не забывать пробелы и другие важные знаки команды для ее корректной работы. Например, в данном случае запущены программы, печатающие бесконечное количество 2 и 3 (раз в секунду), если мы будем печатать командв медленно, то допустим это может выглядеть следующим образом:
$ 23232323jo23b23s23 [1]- Запущен ./a.sh 2 & [2]+ Запущен ./a.sh 3 &
Если мы хотим увидеть только запущенные программы, необходимо ввести jobs -r, тогда остановленные программы не будут показаны. Если остановленные — jobs -s.
Команды для управления процессами
top Если мы хотим получить снимок того, что в данный момент происходит в системе, нужно использовать программу top. (top — просмотр в режиме реального времени данных о процессах, запущенных в системе.)
ps Другая программа для просмотра процессов называется ps, которая обозначает процессы. При обычном использовании покажет вам только процессы, запущенные в вашем текущем терминале. (ps — получить список процессов, запущенных в системе.)
kill Мы будем использовать это, чтобы определить, какой процесс отменить. Для этого мы используем программу, которая соответственно называется kill. Иногда запустив kill, процесс будет остановлен и завершен. Когда вы делаете это, kill отправляет процессу сигнал, который просит процесс завершиться. Мы всегда пробуем эту опцию в первую очередь, это лучший вариант. (kill — завершить запуск процесса.) Чтобы «убивать» задачи, необходимо знать PID (персональный идентификатор процесса). Один из вариантов сделать это — ввести команду jobs -l. Если же мы введем jobs -p, то увидим только PID задач. Чтобы увидеть все возможности kill, необходимо ввести kill -l. Но на самом деле из этого списка необходимо знать только SIGTERM (15) и SIGKILL (9).
SIGTERM – Этот сигнал запрашивает остановку процесса который работает. Этот сигнал может быть проигнорирован.Процессу дается время, чтобы хорошо выключился. Когда программа хорошо выключается, это означает, что ей дано время, чтобы спасти его прогресс и освободить ресурсы. Другими словами, он не «forced» прекращение работы процесса. SIGTERM выполняется по умолчанию при введении kill.
SIGKILL – сигнал SIGKILL заставляет процесс прекратить выполнение своей работы немедленно. Программа не может игнорировать этот сигнал. Несохраненный прогресс будет потерян.
В случае, если по умолчанию задача не убивается можно сделать это следующим образом:
Linux Commands: jobs, bg, and fg
In this quick tutorial, I want to look at the jobs command and a few of the ways that we can manipulate the jobs running on our systems. In short, controlling jobs lets you suspend and resume processes started in your Linux shell.
Jobs
The jobs command will list all jobs on the system; active, stopped, or otherwise. Before I explore the command and output, I’ll create a job on my system.
I will use the sleep job as it won’t change my system in any meaningful way.
[tcarrigan@rhel ~]$ sleep 500 ^Z [1]+ Stopped sleep 500
First, I issued the sleep command, and then I received the Job number [1]. I then immediately stopped the job by using Ctl+Z. Next, I run the jobs command to view the newly created job:
[tcarrigan@rhel ~]$ jobs [1]+ Stopped sleep 500
You can see that I have a single stopped job identified by the job number [1].
Other options to know for this command include:
- -l — list PIDs in addition to default info
- -n — list only processes that have changed since the last notification
- -p — list PIDs only
- -r — show only running jobs
- -s — show only stopped jobs
Background
Next, I’ll resume the sleep job in the background. To do this, I use the bg command. Now, the bg command has a pretty simple syntax, as seen here:
Where JOB_SPEC can be any of the following:
- %n — where n is the job number
- %abc — refers to a job started by a command beginning with abc
- %?abc — refers to a job started by a command containing abc
- %- — specifies the previous job
NOTE: bg and fg operate on the current job if no JOB_SPEC is provided.
I can move this job to the background by using the job number [1].
[tcarrigan@rhel ~]$ bg %1 [1]+ sleep 500 &
You can see now that I have a single running job in the background.
[tcarrigan@rhel ~]$ jobs [1]+ Running sleep 500 &
Foreground
Now, let’s look at how to move a background job into the foreground. To do this, I use the fg command. The command syntax is the same for the foreground command as with the background command.
Refer to the above bullets for details on JOB_SPEC.
I have started a new sleep in the background:
[tcarrigan@rhel ~]$ sleep 500 & [2] 5599
Now, I’ll move it to the foreground by using the following command:
[tcarrigan@rhel ~]$ fg %2 sleep 500
The fg command has now brought my system back into a sleep state.
The end
While I realize that the jobs presented here were trivial, these concepts can be applied to more than just the sleep command. If you run into a situation that requires it, you now have the knowledge to move running or stopped jobs from the foreground to background and back again.