Есть остановленные задания (на выходе bash)


158

Я получаю сообщение, 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.
>>> 

ctrl+z

[1]+  Stopped                 python
example_user@example_server:~$ exit
logout
There are stopped jobs.

Баш не exitвышел , я должен снова выйти из оболочки Баш.

  • В: Что такое «остановленная работа» или что это значит?
  • В: Можно ли возобновить остановленный процесс?
  • Q: Первый exitубивает остановленные задания?
  • Q: Есть ли способ выйти из оболочки в первый раз? (без ввода exitдважды)

Ctrl + Shift + \ также сделает выход Python.
ThorSummoner

Ответы:


206

Остановленное задание - это задание, которое было временно переведено в фоновый режим и больше не выполняется, но все еще использует ресурсы (т. Е. Системную память). Поскольку это задание не подключено к текущему терминалу, оно не может произвести вывод и не получает ввод от пользователя.

Вы можете увидеть выполняемые вами задания, используя jobsвстроенную команду в bash, возможно, и другие оболочки. Пример:

user@mysystem:~$ jobs
[1] + Stopped                python
user@mysystem:~$ 

Вы можете возобновить остановленную работу с помощью fgвстроенной команды (на переднем плане) bash. Если у вас есть несколько команд, которые были остановлены, вы должны указать, какую из них возобновить, передав в командной строке номер спецификаций заданий fg. Если остановлена ​​только одна программа, вы можете использовать fgтолько:

user@mysystem:~$ fg 1
python

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


4
Я бы сошёл с твоим вторым предложением. Должно быть сказано: «Поскольку задание остановлено , оно не может предпринимать никаких действий - файлового ввода-вывода, сетевого ввода-вывода, терминального ввода-вывода или какой-либо другой обработки».
Скотт

2
Это мне очень помогает.
Shellbye

Отличный пост отличная помощь любому!
Джордж Удосен

18

В: Что такое «остановленная работа» или что это значит?

Остановленное задание означает процесс, который получил сигнал остановки ( 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).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.