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

Я получаю сообщение There are stopped jobs.. Вот воспроизводимый сценарий в python 2.x:

  • ctrl + c обрабатывается интерпретатором как исключение.
  • ctrl + z «останавливает» процесс.
  • ctrl + d завершает работу python для реалов.

Вот какой-то реальный вывод терминала:

[email protected]_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
[email protected]_server:~$ exit
logout
There are stopped jobs.

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

  • Q: Что такое «остановленная работа» или что это означает?
  • Q: Можно ли возобновить приостановленный процесс?
  • Q: Выключает ли первый exit остановленные задания?
  • Q: Есть ли способ выйти из оболочки в первый раз? (без ввода exit дважды)
135 голосов | спросил ThorSummoner 26 FebruaryEurope/MoscowbWed, 26 Feb 2014 05:13:47 +0400000000amWed, 26 Feb 2014 05:13:47 +040014 2014, 05:13:47

2 ответа


179

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

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

[email protected]:~$ jobs
[1] + Stopped                python
[email protected]:~$ 

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

[email protected]:~$ fg 1
python

В этот момент вы вернулись в интерпретатор python и можете выйти с помощью control-D.

И наоборот, вы можете kill команду с ее спецификацией jobs или PID. Например:

[email protected]:~$ 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
[email protected]:~$ kill 17781
[1]+  Killed                  python
[email protected]:~$ 

Чтобы использовать спецификацию jobs, перед номером с помощью клавиши процента (%):

[email protected]:~$ kill %1
[1]+  Terminated              python

Если вы выдаете команду exit с остановленными заданиями, будет выдано предупреждение. Работы будут оставлены для обеспечения безопасности. Это необходимо, чтобы вы знали, что пытаетесь убить задания, о которых вы, возможно, забыли, остановились. Во второй раз, когда вы используете команду exit, задания завершаются и оболочка завершается. Это может вызвать проблемы для некоторых программ, которые не предназначены для убийства таким образом.

В bash, кажется, вы можете использовать команду logout, которая будет убивать остановленные процессы и завершать работу. Это может привести к нежелательным результатам.

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

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

[email protected]:~$ python &
[1] 19028
[email protected]:~$ jobs
[1]+  Stopped                 python

Вы можете возобновить и убить эти задания так же, как и задания, которые вы остановили с помощью прерывания Ctrl-z.

ответил OldTimer 26 FebruaryEurope/MoscowbWed, 26 Feb 2014 05:50:24 +0400000000amWed, 26 Feb 2014 05:50:24 +040014 2014, 05:50:24
14
  

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

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

ответил kenorb 20 FebruaryEurope/MoscowbSat, 20 Feb 2016 16:37:01 +0300000000pmSat, 20 Feb 2016 16:37:01 +030016 2016, 16:37:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132