Зупинені робочі місця (на виході з Баша)


157

Повідомлення я отримую, There are stopped jobs.коли інколи намагаюся вийти з оболонки bash. Ось відтворюваний сценарій у python 2.x:

  • ctrl+ перекладач cобробляється як виняток.
  • ctrl+ z«зупиняє» процес.
  • ctrl+ dвиходить з python для дійсних дій.

Ось декілька реальних висновків терміналу:

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.

Bash не вийшов, я exitзнову повинен вийти з оболонки bash.

  • Питання: Що таке "зупинена робота", або що це означає?
  • Питання: Чи можна відновити зупинений процес?
  • З: Чи перший exitвбиває зупинену роботу?
  • З: Чи є спосіб вийти з оболонки вперше? (без введення exitдвічі)

ctrl + shift + \ також зробить вихід python.
ThorSummoner

Відповіді:


205

Зупинене завдання - це тимчасово виведене на другий план і більше не працює, але все ще використовує ресурси (тобто системну пам'ять). Оскільки це завдання не приєднано до поточного терміналу, воно не може виробляти вихід і не отримує вхід від користувача.

Ви можете бачити завдання, які виконуєте, використовуючи jobsвбудовану команду в bash, ймовірно, і інші оболонки. Приклад:

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

Ви можете відновити зупинену роботу за допомогою fgвбудованої команди (переднього плану) bash. Якщо у вас кілька команд, які були зупинені, ви повинні вказати, яку з них відновити, передавши номер робочого коду в командному рядку fg. Якщо зупинена лише одна програма, ви можете користуватися fgокремо:

user@mysystem:~$ fg 1
python

У цей момент ви знову в інтерпретаторі python і можете вийти, використовуючи control-D.

І навпаки, ви можете killвиконувати команду з або jobspec або 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:~$ 

Щоб використовувати taskpec, передуйте цифрі за допомогою клавіші відсоток (%):

user@mysystem:~$ kill %1
[1]+  Terminated              python

Якщо ви випустите команду виходу із зупиненими завданнями, з’явиться попередження, яке ви побачили. Роботи залишатимуться для забезпечення безпеки. Це для того, щоб переконатися, що ви знаєте, що намагаєтесь вбити роботу, яку, можливо, забули, що зупинилися. Вдруге, коли ви використовуєте команду exit, завдання припиняються і оболонка виходить. Це може спричинити проблеми для деяких програм, які не призначені для вбивства таким чином.

Здається, в 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]).

Питання: Чи вбиває перший вихід зупинені завдання?

Перший раз, коли ви вводите exit/ logoutчи натискаєте Ctrl-D, оболонка друкує попереджувальне повідомлення про поточні активні завдання, пов’язані з вашим терміналом, тому вона не вбиватиме вас без вашого дозволу, підтвердивши дію вдруге. Якщо checkjobsпараметр увімкнено ( shopt -s checkjobs), він також може перелічити завдання зі своїми статусами.

З: Чи є спосіб вийти з оболонки вперше? (без входу двічі)

Ви можете натиснути Ctrl+Dдвічі або потримати довше, це дозволить вимкнути оболонку тихо, швидко знищивши поточну роботу зупинки / запуску шельфу.

Як альтернативи відхрестився їх ( disown) , щоб залишити їх або вбити їх вручну kill $(jobs -p).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.