Есть остановленные задания (на выходе bash)
Я получаю сообщение, There are stopped jobs. когда пытаюсь иногда выйти из оболочки bash. Вот воспроизводимый сценарий в Python 2.x:
- ctrl + c обрабатывается интерпретатором как исключение.
- ctrl + z «останавливает» процесс.
- ctrl + d выход из питона для реалов.
Вот некоторые из реальных выводов терминала:
Баш не exit вышел , я должен снова выйти из оболочки Баш.
- В: Что такое «остановленная работа» или что это значит?
- В: Можно ли возобновить остановленный процесс?
- Q: Первый exit убивает остановленные задания?
- Q: Есть ли способ выйти из оболочки в первый раз? (без ввода exit дважды)
Остановленное задание — это задание, которое было временно переведено в фоновый режим и больше не выполняется, но все еще использует ресурсы (т. Е. Системную память). Поскольку это задание не подключено к текущему терминалу, оно не может произвести вывод и не получает ввод от пользователя.
Вы можете увидеть выполняемые вами задания, используя jobs встроенную команду в bash, возможно, и другие оболочки. Пример:
Вы можете возобновить остановленную работу с помощью fg встроенной команды (на переднем плане) bash. Если у вас есть несколько команд, которые были остановлены, вы должны указать, какую из них возобновить, передав в командной строке номер спецификаций заданий fg . Если остановлена только одна программа, вы можете использовать fg только:
В этот момент вы вернулись в интерпретатор python и можете выйти, используя control-D.
И наоборот, вы можете kill использовать команду с указанием ее задания или PID. Например:
Чтобы использовать спецификацию заданий, перед числом введите клавишу процента (%):
Если вы выполните команду выхода с остановленными заданиями, появится предупреждение, которое вы увидели. Работы будут оставлены для безопасности. Это делается для того, чтобы вы знали, что пытаетесь убить работу, о которой забыли, что остановились. При втором использовании команды выхода задания завершаются, и оболочка завершается. Это может вызвать проблемы для некоторых программ, которые не предназначены для уничтожения таким способом.
В bash кажется, что вы можете использовать logout команду, которая убьет остановленные процессы и завершит работу. Это может привести к нежелательным результатам.
Также обратите внимание, что некоторые программы могут не завершиться таким образом, и ваша система может закончить множеством потерянных процессов, используя ресурсы, если вы сделаете это привычкой.
Обратите внимание, что вы можете создать фоновый процесс, который остановится, если потребуется ввод данных пользователем:
Вы можете возобновить и убить эти задания так же, как вы выполняли задания, которые были остановлены с помощью Ctrl-z прерывания.
Источник
Как я могу убить все остановленные задания?
Когда я пытаюсь выйти с моего Linux-сервера, я получаю сообщение:
: Есть ли одна команда, чтобы убить их?
8 ответов
Чтобы быстро убить все задания, запущенные под bash, введите:
jobs -ps отображает идентификатор процесса остановленных заданий. kill `jobs -ps` отправить сигнал TERM во все остановленные задания.
Попробуйте ввести следующее:
Принятый ответ убьет все задания (которых в этом случае достаточно), а не только остановленные. Если вы хотите убить только остановленные, запустите:
Самый простой способ — просто просто сразу же повторить выход; bash будет означать «убить все остановленные задания и выйти».
Если вы хотите удалить некоторые остановленные задания, но не все, попробуйте следующее:
Во-первых, перечислите задания, вы получите что-то вроде этого:
отправить убить на остановленное задание, он ничего не сделает, кроме очереди чем привести его на передний план, он завершит
Обычно, если вы получили это сообщение, вам необходимо дважды выйти из системы. Например. сначала Ctrl + D дает вам предупреждающее сообщение, информирующее вас о остановленных заданиях, нажатие второго раза приведет к выходу из игры, убив задания. Это также относится к командам logout и exit .
Чтобы убить их вручную, попробуйте: kill $(jobs -p) .
Если вы не хотите убивать задания из текущей оболочки, вы можете удалить их из таблицы активных заданий без убийства с помощью команды disown . Например.
Остановленные задания также могут определяться состоянием процесса (символ T ), что означает, что процесс был остановлен сигналом, таким как SIGSTOP , SIGTSTP или другой (например, SIGTTIN или SIGTTOU ).
В случае, если jobs команда встроенной оболочки недоступна, остановленные процессы могут быть перечислены с помощью следующей команды:
Чтобы убить их всех, вы можете в принципе ввести:
Вот простой тест:
На всякий случай это помогает кому-то другому — большинство людей здесь, потому что у них есть некоторые остановленные процессы, которые они начали, возможно, с помощью оболочки. Мне нужно было найти процессы как root, остановленные другими пользователями, для которых варианты команды jobs не будут выполняться.
Немного о копании с помощью man ps привлек меня к этому:
Объяснение: флаг -a показывает все процессы, затем -o управляет выводом, какая информация будет отображаться о каждом процессе. Я выбираю pid , user , cmd (командная строка) и state , который является состояние процесса .
, так что, наконец, я передаю его в grep T$ , который говорит, покажите мне все процессы с T в последнем столбце.
И тогда у меня есть хороший список всех процессов от разных пользователей, находящихся в остановленном состоянии.
Источник
Управление заданиями
Наверное всякий nix-оид знает что запуская команду с амперсандом на конце — она уходит в фон, продолжая работу.
Таким образом запущенная команда превращается в job (задание).
Более продвинутые знают что можно вывести список запущенных заданий командой jobs, и переключиться между ними командами fg (вывести фоновую задачу в оболочку)/ bg (отправить остановленное задание в фон). Остальными командами пользуются куда реже, а большинство начинающих линуксоидов про них читали мельком, но забыли, или вообще никогда не знали. А между прочим кроме: jobs, fg и bg есть disown, wait и даже kill.
Не считая тех, что можно использовать внутри задания или для управления написанными выше командами: enable, builtin.
Итак если вам интересно как делается:
1. Приостановка job-в. Остановка (kill).
2. Запуск ранее приостановленного job-а.
3. Advanced нумерация заданий.
4. Ожидание завершения фоновых задач.
5. Команда disown.
Запустим три задания:
$ nice gzip /dev/null &
[1] 15727
$ bzip2 /dev/null &
[2] 15728
$ xz /dev/null &
[3] 15730
Три задания, с номерами 1, 2, 3. и их PID-ами.
Остановка заданий
Приостановка
Приостанвим задание, например первое:
это сделает команда kill, передавая сигнал SIGSTOP.
В данном случае использовалась внутренняя команда bash-а: kill, а не внешняя программа /bin/kill.
Да, /bin/kill тоже можно использовать для того чтобы передать сигнал SIGSTOP, но внешняя программа не умеет обращаться с номером задания, ей подавай PID.
В линуксе еще достаточно удобно: 4-5 значный PID (2 байта), но в AIX-е pid-ы в основном 8значные PIDы, а могут иметь и 9 цифр, к тому же не последовательны, а разбросаны по своему 4байтному диапазону.
Сигнал SIGSTOP — это один из трех сигналов которые приложение не может игнорировать (SIGSTOP, SIGCONT, SIGKILL который обычно 9). Да, конечно у каждого из них есть и числовой код (например kill -9 означает kill -SIGKILL), но не на всех платформах они совпадают. Узнать их соответствие можно или из документации (man signal/man 7 signal/man kill), или прямо (внутренней)командой kill -l.
Завершение задания
Аналогично:
kill -SIGKILL %1 или PID процесса.
Запуск приостановленного ранее
bg %1 — отправка приостановленного задания выполняться в фон.
fg %1 — переключение в остановленное (или запущенное задание)
Еще вариант: переключиться в это задание и остановить его Ctrl+Z:
Advanced нумерация заданий
Вот у меня продолжают сжимать нули три процесса:
Первое поле в квадратных скобках — номер job-а. К нему можно обратиться такими командами как fg, bg, kill (внутренней), disown, wait.
Второе поле: имеет — (минус) для 2го задания и + (плюс) для 3го — это номера заданий в нотации: «Последнее» и «Текущее».
Текущее — это то «с которым мы работаем сейчас». Если у нас запущенно одно задание — то только оно будет иметь +. Если мы переключимся на другое задание командой fg — оно станет «текущим». Команды fg и bg без номера заданий будут работать с Текущим. К нему можно также обратиться через %+ или %%
Последнее — это то, которое было перед «Текущим». Если мы завершим текущее (kill -9 %% ) — то Последнее станет Текущим. Этакий стек заданий. К нему можно обратиться через %-
Также для команд fg, bg, kill, disown, wait к заданиям можно обратиться через имя запускаемой команды:
запустим еще sleep
Убъет только одно задание, который начинается на x (у меня пострадает архивация командой xz)
убьет команду, которая содержит gzip. ( Такой процесс у меня тоже только один), а если маска такая, что в неё входит несколько заданий (например в предыдущей команда kill -9 #?zip, то такое не получится, т.к. и nice gzip и bzip2 попадают под такую маску, и нельзя точно определить к какому заданию относится команда. Хотя странно: для fg то еще можно понять что нужен один аргумент, а kill может принимать несколько аргументов, bg не может но мог бы, но в общем все команды не могут разобраться c неоднозначными масками)
Подробнее смотрите таблицу из ABS Guide
enable и builtin
Тут то и следует рассказать о командах enable и builtin:
Из ссылки выше:
Конструкция builtin BUILTIN_COMMAND запускает внутреннюю команду «BUILTIN_COMMAND», на время запрещая использование функций и внешних системных команд с тем же именем.
enable Либо запрещает, либо разрешает вызов внутренних команд. Например, enable -n kill запрещает использование внутренней команды kill, в результате, когда интерпретатор встретит команду kill, то он вызовет внешнюю команду kill, т.е. /bin/kill.
Внутренние команды вызываются быстрее чем внешние, полноценные программы, хотя бы потому, что нет необходимости форкать дочерний процесс, переключаться между ними. Список внутренних команд можно посмотреть enable -a.
Ожидание завершения фоновых задач
Команда wait — приостанавливает работу сценария до тех пор пока не будут завершены все фоновые задания или пока не будет завершено задание/процесс с указанным номером задания/PID процесса. Возвращает код завершения указанного задания/процесса.
Часто используется для синхронизации процессов: запустить один или несколько задач в фоне (параллельно), дождаться их завершения, и продолжить следующую фазу.
Запустит одновременно закачку по списку всех url, и только когда будет завершатся все закачки — перекинет их на флешку.
Команда disown
disown — Удаляет задание из таблицы активных заданий командной оболочки. Т.е. процесс продолжает работать в фоновом режиме, но уже не является заданием.
Полезно процессам запущенных командой nohup — она перехватывает сигнал SIGHUP, а также забирает потоки вывода к себе в файл nohup.out.
Также есть команды: suspend, times и logout, и times.
Например times %N — выводит накопленное время в userspace и system для job-а и текущей оболочки. Suspend приостаналивает текущую оболочку, как это можно было бы сделать нажав ctrl+Z для другой команды, но при условии что текущая оболочка работает не в режиме login shell. Но даже не представляю как их можно применять.
Источник
Есть остановленные задания (при выходе из bash)
Я получаю сообщение There are stopped jobs. . Вот воспроизводимый сценарий в python 2.x:
- ctrl + c обрабатывается интерпретатором как исключение.
- ctrl + z «останавливает» процесс.
- ctrl + d завершает работу python для реалов.
Вот какой-то реальный вывод терминала:
Bash не вышел, я должен exit снова, чтобы выйти из оболочки bash.
- Q: Что такое «остановленная работа» или что это означает?
- Q: Можно ли возобновить приостановленный процесс?
- Q: Выключает ли первый exit остановленные задания?
- Q: Есть ли способ выйти из оболочки в первый раз? (без ввода exit дважды)
2 ответа
Задержанное задание — это тот, который был временно помещен в фоновый режим и больше не работает, но все еще использует такие ресурсы (например, системную память). Поскольку это задание не подключено к текущему терминалу, оно не может выдавать выходные данные и не получает вход от пользователя.
Вы можете видеть задания, которые выполнялись с помощью команды jobs builtin в bash, возможно, других оболочек. Пример:
Вы можете возобновить остановленное задание с помощью встроенной команды bash fg (foreground) bash. Если у вас несколько остановленных команд, вы должны указать, какой из них нужно возобновить, передав номер задания в командной строке с помощью fg . Если только одна программа остановлена, вы можете использовать только fg :
В этот момент вы вернулись в интерпретатор python и можете выйти с помощью control-D.
И наоборот, вы можете kill команду с ее спецификацией jobs или PID. Например:
Чтобы использовать спецификацию jobs, перед номером с помощью клавиши процента (%):
Если вы выдаете команду exit с остановленными заданиями, будет выдано предупреждение. Работы будут оставлены для обеспечения безопасности. Это необходимо, чтобы вы знали, что пытаетесь убить задания, о которых вы, возможно, забыли, остановились. Во второй раз, когда вы используете команду exit, задания завершаются и оболочка завершается. Это может вызвать проблемы для некоторых программ, которые не предназначены для убийства таким образом.
В bash, кажется, вы можете использовать команду logout , которая будет убивать остановленные процессы и завершать работу. Это может привести к нежелательным результатам.
Также обратите внимание, что некоторые программы не могут выйти при завершении таким образом, и ваша система может закончиться большим количеством сиротских процессов, используя ресурсы, если вы привыкли делать это.
Обратите внимание, что вы можете создать фоновый процесс, который остановится, если он потребует ввода пользователем:
Вы можете возобновить и убить эти задания так же, как и задания, которые вы остановили с помощью прерывания Ctrl-z .
В: Что такое «остановленная работа» или что это означает?
Остановленное задание означает процесс, который получил сигнал останова ( SIGSTOP / SIGTSTP ) с клавиатуры (suspend character 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 дважды, или удерживать его дольше, это приведет к выходу из оболочки тихо, быстро убив текущие остановленные /выполняемые задания.
Альтернативно отключите их ( disown ), чтобы оставить их или убить их вручную: kill $(jobs -p) .
Источник