Есть остановленные задания (на выходе bash)
Я получаю сообщение, 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. >>>
[1]+ Stopped python example_user@example_server:~$ exit logout There are stopped jobs.
Баш не exit вышел , я должен снова выйти из оболочки Баш.
- В: Что такое «остановленная работа» или что это значит?
- В: Можно ли возобновить остановленный процесс?
- Q: Первый exit убивает остановленные задания?
- Q: Есть ли способ выйти из оболочки в первый раз? (без ввода exit дважды)
Остановленное задание — это задание, которое было временно переведено в фоновый режим и больше не выполняется, но все еще использует ресурсы (т. Е. Системную память). Поскольку это задание не подключено к текущему терминалу, оно не может произвести вывод и не получает ввод от пользователя.
Вы можете увидеть выполняемые вами задания, используя jobs встроенную команду в bash, возможно, и другие оболочки. Пример:
user@mysystem:~$ jobs [1] + Stopped python user@mysystem:~$
Вы можете возобновить остановленную работу с помощью fg встроенной команды (на переднем плане) bash. Если у вас есть несколько команд, которые были остановлены, вы должны указать, какую из них возобновить, передав в командной строке номер спецификаций заданий fg . Если остановлена только одна программа, вы можете использовать fg только:
В этот момент вы вернулись в интерпретатор 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 прерывания.
Я бы сошёл с твоим вторым предложением. Должно быть сказано: «Поскольку задание остановлено , оно не может предпринимать никаких действий — файлового ввода-вывода, сетевого ввода-вывода, терминального ввода-вывода или какой-либо другой обработки».
В: Что такое «остановленная работа» или что это значит?
Остановленное задание означает процесс, который получил сигнал остановки ( 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) .
Есть приостановленные задачи linux
Команды batch и at позволяют вам определять время запуска команды или последовательности команд. При помощи команды batch система определяет время запуска команды, вы это можете определить с помощью команды at. Обе команды ожидают ввод со стандартного ввода (терминала); список команд, вводимых с терминала, должен завершаться нажатием клавиши ^d (одновременное нажатие клавиши Ctrl и клавиши d).
Команда batch очень полезна, если вы запускаете процесс или программу, которые занимают много системного времени. Команда batch представляет системе задание (содержащее последовательность команд для выполнения). Задание ставится в очередь и запускается как только у системы появляется возможность. Это позволяет системе быстро отвечать на запросы других пользователей. Общий формат команды batch:
batch первая команда . . . последняя команда
Если запускается только одна команда, то ее можно ввести в одной командной строке:
В следующем примере batch используется для выполнения команды grep в согласованное время. Команда grep осуществляет поиск всех файлов в текущем справочнике и перенаправляет вывод в файл dol.file.
$ batch grep dollar * > dol.file job 155223141.b at Sun Dec 11:14:54 1989 $
После того как вы зададите задание batch, система выдаст ответ, в котором даны номер задания, дата и время. Номер задания не то же самое, что номер процесса, который система генерирует, когда вы запускаете команду в фоновом режиме.
Команда at позволяет вам указывать точное время выполнения команд. Общий фомат команды at:
at time первая команда . . . последняя команда
Аргумент time состоит из времени дня и даты, если дата не сегодняшняя.
В следующем примере показано, как использовать команду at для посылки сообщения happy birthday пользователю с регистрационным именем emily:
$ at 8:15am Feb 27 banner happy birthday | mail emily $
Обратите внимание, что команда at подобно команде batch выдает ответ с номером задания, датой и временем.
Если вы не хотите, чтобы команды, находящиеся в данный момент в очереди заданий batch или at были выполнены, то можете удалить их из очереди. Для этого воспользуйтесь опцией -r в команде at, указав ее с номером задания. Общий формат такой команды:
$ at -lCW user mylogin 168302040.a at Sat Nov 25 13:00:00 1989 user mylogin 453400603.a at Fri Feb 24 08:15:00 1989 $
Таким образом команда at выполняет команды в указанное время. Вы можете использовать от одной до 4-х цифр и буквосочетания «am» и «pm», чтобы указать время. Чтобы указать дату, задайте имя месяца и вслед за ним число. Если задание должно быть выполнено сегодня, то дату вводить не надо.
at 08:15am Feb 27 at 5:14pm Sept 24
8.4.2. Получить состояние запущенного процесса
Команда ps дает вам состояние всех процессов, запущенных на данный момент. Например, вы можете использовать команду ps, чтобы просмотреть состояние всех процессов, которые запущены в фоновом режиме, применив символ &.
В следующем подпункте обсуждается вопрос, как применить номер PID (идентификатор процесса), чтобы остановить выполнение команды. PID является уникальным номером, который система UNIX назначает каждому активному процессу.
В следующем примере команда grep запускается в фоновом режиме и затем выдается команда ps. Система сообщает в ответ номер идентификации процесса (PID) и номер терминала (TTY). Она также выдает время выполнения каждого процесса (TIME) и имя команды, которая выполняется (COMMAND):
$ grep word * > temp 28223 $ $ ps PID TTY TIME COMD 28124 tty10 0:00 sh 28223 tty10 0:04 grep 28224 tty10 0:04 ps $
Обратите внимание, что система распечатала номер PID для команды grep так же, как и для всех других запущенных процессов: для самой команды ps и команды sh, которая была запущена во время вашей регистрации.
Вы можете приостановить и вновь запустить программу, если в вашей системе предусмотрена функция управления заданиями. Команда jobs выдает список текущих фоновых процессов, запущенных или приостановленных. Команда jobs дополнительно к PID распечатывает идентификатор задания (JID) и имя задания. Чтобы вновь запустить приостановленное задание, либо возобновить фоновый процесс в оперативном режиме, вам необходимо знать JID. JID распечатывается на экране каждый раз, когда вы вводите команду запуска или останова процесса. Если вы введете:
8.4.3. Завершение активных процессов
Команда kill завершает активные процессы в фоновом режиме и команда stop приостанавливает временно процессы. Общий формат этих команд:
Обратите внимание, что вы не можете завершать фоновые задания нажатием клавиш BREAK или DEL. Следующий пример показывает, как вы можете завершить команду grep, которая выполняется в фоновом режиме.
$ kill 28223 28223 Terminated $
После того как система выдаст ответ на запрос, на экране появится подсказка $, означающая, что процесс завершен. Если система не найдет указанный PID, то появится сообщение об ошибке:
Чтобы приостановить оперативный процесс (если активна функция управления заданиями), введите:
8.4.4. Запуск остановленного задания
Если функция управления заданиями активна, то вы можете вновь запустить приостановленный процесс. Чтобы вновь запустить процесс, остановленный командой stop, вы сначала должны определить JID с помощью команды jobs. Затем вы можете использовать JID со следующими командами: fg — возобновляет приостановленное задание или переводит задание из фонового режима в оперативный; bg — вновь запускает приостановленное задание в фоновом режиме.
8.4.5. Использование команды nohup
Все процессы, за исключением at и batch, завершаются, когда вы выходите из системы. Если вы хотите, чтобы после вашего выхода из системы процесс в фоновом режиме продолжал выполняться, то вам необходимо использовать команду nohup. Команда nohup имеет следующий формат:
Предположим, вы хотите, чтобы команда grep осуществила поиск во всех файлах в вашем текущем справочнике строки «word» и перенаправила вывод в файл word.list, и затем, не ожидая завершения, вы хотите выйти из системы, то введите следующую строку:
nohup grep word * > word.list &
Вы можете завершить команду nohup с помощью команды kill.