Linux есть приостановленные задачи

DevBuzz — Ресурс для Менеджеров проектов, Системных аналитиков, и Веб-разработчиков

Блог компании General Software. http://gsoft.ru

Свежие записи

Свежие комментарии

  • Aaroignob к записи Ubuntu — Правильные права на файлы сайтов
  • kapxapot к записи Как обратиться к статическому методу изнутри класса
  • kapxapot к записи Я — айтишник

Архивы

Рубрики

Счетчики

Фоновые задачи в Linux

Задачи в консоли можно выполнять на переднем плане и в фоне.

На переднем плане может выполняться только одна задача.

В фоне может быть выполняться множество задач.

Фоновые задачи принадлежат тому терминалу, в котором они запущены, т.е. когда мы выключаем терминал — задачи, которые работают у него в фоне убиваются.

Чтобы запустить задачу в фоне, нужно в конце команды написать &, например #yes > /dev/null &

Чтобы просмотреть задачи, исполняемые в фоне, нужно выполнить команду jobs

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

Чтобы приостановить задачу, нужно выполнить Ctrl+Z

Приостановленную задачу можно запустить снова в фоновом режиме или на переднем плане. Чтобы перезапустить задачу в фоновом режиме, нужно выполнить команду bg. На переднем плане — fg.

Чтобы убить задачу, нужно выполнить команду kill и указать её номер с процентом, например kill %1

Если команда выводит что-то на экран, то она будет выводить это на экран, не зависимо от того, работает ли она в фоновом режиме, или на переднем плане.

Источник

7 способов «убить» зависшее приложение в Linux

Программное обеспечение Linux достаточно надежно, но бывает, что даже самые лучшие приложения могут зависнуть. Вместо того, чтобы ждать сообщения о сбое в работе приложений, вы можете «убить» их, принудительно завершив. На самом деле способов это сделать существует настолько много, что глаза разбегаются!

Если у вас возникают такие проблемы, вот несколько способов, как принудительно завершить программу в Linux.

1. Завершить программу в Linux, просто нажав на «X»

Вы, наверное, уже пытались уйти и сделать себе чашечку кофе, но когда вернулись, обнаружили, что ваша программа зависла, вероятно, у него было достаточно времени, чтобы «отвиснуть», но этого не произошло. Зависшее приложение обычно имеет серые неактивные кнопки управления и у него пропадает возможность перемещения.

Итак, как эту проблему решить? Нажмите на «крестик» в верхнем углу (слева или справа, в зависимости от версии системы Linux). Это должно помочь. Возможно, появится окно с просьбой подождать или принудительно завершить процесс, а также отправить отчет об ошибке.

2. Воспользуйтесь системным монитором, чтобы «убить» процесс Linux

Следующий вариант — открыть утилиту System Monitor вашей операционной системы Linux. Обычно она находится в меню «Системные инструменты» и отображает список запущенных процессов на вкладке «Процессы«.

Чтобы закрыть не отвечающее приложение, просто выберите его и щелкните правой кнопкой мыши. Затем у вас появится три варианта:

  • Остановить: приостанавливает процесс, позволяя продолжить его позже. Не будет работать в большинстве случаев.
  • Завершить: правильный способ закрыть процесс, он безопасно завершит работу приложения, вместе с ним удаляя временные файлы.
  • Убить: вариант на крайний случай и его рекомендуется применять только в случае сбоя.

Лучше всего использовать их по порядку. Однако, если приложение регулярно зависает, можно использовать вариант, в котором вы точно уверены.

3. Принудительное уничтожение процесса Linux с помощью xkill

Другой вариант — использование команды xkill в терминале. Это инструмент принудительного уничтожения процесса, который предустановлен в Ubuntu, но его можно также установить через терминал в других дистрибутивах, если необходимо. xkill позволит закрыть любой процесс. Установить его можно с помощью следующей команды:

Как только установите, наберите:

Вместо указателя мыши появится крест (или череп). Далее необходимо щелкнуть левой кнопкой мыши на зависшем приложении, чтобы закрыть его.

Читайте также:  Windows version support date

Если невозможно закрыть зависшее приложение одним из этих методов, то решение может быть в терминале Linux.

4. Используйте команду «kill»

Если ни один из вышеперечисленных методов не помог и приложение до сих пор не отвечает, нажмите Ctrl + Alt + T, чтобы открыть терминал.

Есть несколько команд, которые должны помочь закрыть ваше приложение. Более того, их можно использовать как на вашем компьютере, так и подключившись удаленно через SSH.

Команда kill может быть использована только с указанием идентификатора процесса. Сначала выясним его:

В результате вы увидите ID нужного процесса. Далее используем команду:

Возможно, вам понадобятся системные права для использования программы, тогда используйте sudo.

5. Используйте команды «pgrep» и «pkill»

Что, если вы не смогли найти идентификатор процесса. Здесь вам поможет команда pkill.

Кроме того, можно использовать команду pgrep, чтобы найти идентификатор процесса:

После этого используйте команду pkill с ID процесса.

Как и в случае команды kill, процесс должен завершиться в течение 5 секунд.

6. Уничтожить все экземпляры процесса с помощью «killall»

Не повезло с kill или pkill? Пришло время использовать ядерную опцию: killall.

К счастью, она не так разрушительна, какой могла бы быть. Команда killall завершит все экземпляры указанной программы. Таким образом, вместо того, чтобы убивать одно окно Firefox, данная команда завершит их все:

Все, что вам нужно, это имя процесса и команда killall (возможно, с sudo, если этого требует ваша система).

Естественно, вы должны использовать эту команду только при необходимости. Она не подходит для большинства ситуаций.

7. Создайте комбинацию клавиш

Хотите сэкономить время на закрытие не отвечающего программного обеспечения? Наилучшим вариантом является создание сочетания клавиш. Это даст вам возможность немедленно закрыть приложение, но для этого потребуется xkill.

В Ubuntu откройте «Настройки«>«Клавиатура» и нажмите «Комбинации клавиш«. Выберите Дополнительные комбинации, затем +, чтобы создать новую. Введите «xkill» для названия, затем нажмите «Применить«. Это вернет вас к списку комбинаций — выберите нужную, затем нажмите необходимую комбинацию клавиш, которую вы будете использовать для ее вызова.

В следующий раз, когда вам нужно закрыть приложение, просто используйте сочетание клавиш. Указатель мыши станет «X», и вы можете щелкнуть в любом месте приложения, которое хотите закрыть.

Избегайте зависаний программ: обновите свое оборудование

Зависающие программы постоянно вызывают проблемы? Возможно, пора немного обновить ваш компьютер.

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

Итак, в следующий раз, когда приложение или утилита Linux зависнет и перестанет отвечать на запросы, все, что вам нужно сделать, это применить одно из следующих решений:

  1. Завершить программу в Linux, просто нажав на «X».
  2. Воспользуйтесь системным монитором, чтобы «убить» процесс Linux.
  3. Принудительное уничтожение процесса Linux с помощью xkill.
  4. Используйте команду «kill».
  5. Используйте команды «pgrep» и «pkill».
  6. Уничтожить все экземпляры процесса с помощью «killall».
  7. Создайте сочетание клавиш.

Если ни одно из этих решений не работает и вы регулярно испытываете не отвечающие приложения Linux, рассмотрите возможность перехода на облегченную операционную систему Linux.

Источник

Есть остановленные задания (при выходе из 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 :

Читайте также:  Не показывает язык windows 10

В этот момент вы вернулись в интерпретатор 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) .

Источник

Управление заданиями

Наверное всякий 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байтному диапазону.

Читайте также:  Fdisk create linux partition

Сигнал 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. Но даже не представляю как их можно применять.

Источник

Оцените статью