Работа с процессами (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 заставляет процесс прекратить выполнение своей работы немедленно. Программа не может игнорировать этот сигнал. Несохраненный прогресс будет потерян.
В случае, если по умолчанию задача не убивается можно сделать это следующим образом:
Есть остановленные задания (на выходе bash)
Я получаю сообщение, There are stopped jobs. когда пытаюсь иногда выйти из оболочки bash. Вот воспроизводимый сценарий в Python 2.x:
- ctrl + c обрабатывается интерпретатором как исключение.
- ctrl + z «останавливает» процесс.
- ctrl + d выход из питона для реалов.
Вот некоторые из реальных выводов терминала:
example_user@example_server:~$ python Python 2.7.3 (default, Sep 26 2013, 20:03:06) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>
[1]+ Stopped python example_user@example_server:~$ exit logout There are stopped jobs.
Баш не exit вышел , я должен снова выйти из оболочки Баш.
- В: Что такое «остановленная работа» или что это значит?
- В: Можно ли возобновить остановленный процесс?
- Q: Первый exit убивает остановленные задания?
- Q: Есть ли способ выйти из оболочки в первый раз? (без ввода exit дважды)
Остановленное задание — это задание, которое было временно переведено в фоновый режим и больше не выполняется, но все еще использует ресурсы (т. Е. Системную память). Поскольку это задание не подключено к текущему терминалу, оно не может произвести вывод и не получает ввод от пользователя.
Вы можете увидеть выполняемые вами задания, используя jobs встроенную команду в bash, возможно, и другие оболочки. Пример:
user@mysystem:~$ jobs [1] + Stopped python user@mysystem:~$
Вы можете возобновить остановленную работу с помощью fg встроенной команды (на переднем плане) bash. Если у вас есть несколько команд, которые были остановлены, вы должны указать, какую из них возобновить, передав в командной строке номер спецификаций заданий fg . Если остановлена только одна программа, вы можете использовать fg только:
В этот момент вы вернулись в интерпретатор python и можете выйти, используя control-D.
И наоборот, вы можете kill использовать команду с указанием ее задания или PID. Например:
user@mysystem:~$ ps PID TTY TIME CMD 16174 pts/3 00:00:00 bash 17781 pts/3 00:00:00 python 18276 pts/3 00:00:00 ps user@mysystem:~$ kill 17781 [1]+ Killed python user@mysystem:~$
Чтобы использовать спецификацию заданий, перед числом введите клавишу процента (%):
user@mysystem:~$ kill %1 [1]+ Terminated python
Если вы выполните команду выхода с остановленными заданиями, появится предупреждение, которое вы увидели. Работы будут оставлены для безопасности. Это делается для того, чтобы вы знали, что пытаетесь убить работу, о которой забыли, что остановились. При втором использовании команды выхода задания завершаются, и оболочка завершается. Это может вызвать проблемы для некоторых программ, которые не предназначены для уничтожения таким способом.
В bash кажется, что вы можете использовать logout команду, которая убьет остановленные процессы и завершит работу. Это может привести к нежелательным результатам.
Также обратите внимание, что некоторые программы могут не завершиться таким образом, и ваша система может закончить множеством потерянных процессов, используя ресурсы, если вы сделаете это привычкой.
Обратите внимание, что вы можете создать фоновый процесс, который остановится, если потребуется ввод данных пользователем:
user@mysystem:~$ python & [1] 19028 user@mysystem:~$ jobs [1]+ Stopped python
Вы можете возобновить и убить эти задания так же, как вы выполняли задания, которые были остановлены с помощью Ctrl-z прерывания.
Я бы сошёл с твоим вторым предложением. Должно быть сказано: «Поскольку задание остановлено , оно не может предпринимать никаких действий — файлового ввода-вывода, сетевого ввода-вывода, терминального ввода-вывода или какой-либо другой обработки».
В: Что такое «остановленная работа» или что это значит?
Остановленное задание означает процесс, который получил сигнал остановки ( SIGSTOP / SIGTSTP ) от клавиатуры (символ приостановки Ctrl-Z ), команды (например kill -STOP [PID] ) или другого процесса (например, ядро, когда у системы недостаточно ресурсов), и он находится в состоянии паузы, поэтому он сообщает системе остановить / приостановить процесс, поэтому он не будет выполнять / обработку.
Активные работы оболочек могут быть перечислены: jobs .
В: Можно ли возобновить остановленный процесс?
Остановленный процесс возобновит выполнение, только если ему будет отправлен SIGCONT сигнал. Это может быть достигнуто либо fg (или fg ID ), который переместит задание на передний план, делая его текущим заданием, bg продолжить его в фоновом режиме, либо отправив SIGCONT сигнал (например kill -CONT [PID] ).
Q: убивает ли первый выход остановленные задания?
В первый раз, когда вы нажимаете exit / logout или нажимаете Ctrl-D , оболочка печатает предупреждающее сообщение о текущих активных заданиях, связанных с вашим терминалом, поэтому она не убьет вас без вашего разрешения, подтвердив действие во второй раз. Если checkjobs опция включена ( shopt -s checkjobs ), она также может перечислять задания с их статусами.
Q: Есть ли способ выйти из оболочки в первый раз? (без входа в выход дважды)
Вы можете нажать Ctrl+D два раза или удерживать его дольше, это приведет к быстрому выходу из оболочки, убивая текущие остановленные / запущенные задания shel.
В качестве альтернативы открестился их ( disown ) , чтобы оставить их или убить их вручную kill $(jobs -p) .