Поиск…


Список текущих заданий

$ tail -f /var/log/syslog > log.txt
[1]+  Stopped                 tail -f /var/log/syslog > log.txt

$ sleep 10 &

$ jobs
[1]+  Stopped                 tail -f /var/log/syslog > log.txt
[2]-  Running                 sleep 10 &

Обработка работы

Создание рабочих мест

Чтобы создать задание, просто добавьте один & после команды:

$ sleep 10 &
[1] 20024

Вы также можете сделать выполняемый процесс заданием, нажав Ctrl + z :

$ sleep 10
^Z
[1]+  Stopped                 sleep 10

Фоновый и передний план процесса

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

$ sleep 10 &
[1] 20024

$ fg %1
sleep 10

Теперь вы можете взаимодействовать с процессом. Чтобы вернуть его на задний план, вы можете использовать команду bg . Из-за занятой сессии терминала вам нужно сначала остановить процесс, нажав Ctrl + z .

$ sleep 10
^Z
[1]+  Stopped              sleep 10

$ bg %1
[1]+ sleep 10 &

Из-за лени некоторых программистов все эти команды также работают с одним % если есть только один процесс или первый процесс в списке. Например:

$ sleep 10 &
[1] 20024

$ fg %        # to bring a process to foreground 'fg %' is also working.
sleep 10

или просто

$ %           # laziness knows no boundaries, '%' is also working.
sleep 10

Кроме того, просто набрав fg или bg без какого-либо аргумента, обработает последнее задание:

$ sleep 20 &
$ sleep 10 &
$ fg
sleep 10
^C
$ fg
sleep 20

Убийство рабочих мест

$ sleep 10 &
[1] 20024

$ kill %1
[1]+  Terminated              sleep 10

Процесс сна выполняется в фоновом режиме с идентификатором процесса (pid) 20024 и номером задания 1 . Чтобы ссылаться на этот процесс, вы можете использовать либо pid, либо номер задания. Если вы используете номер задания, вы должны указать его % . Сигнал уничтожения по умолчанию, отправленный kill - это SIGTERM , который позволяет целевому процессу выйти изящно.

Ниже приведены некоторые общие сигналы об уничтожении. Чтобы просмотреть полный список, запустите kill -l .

Название сигнала Значение сигнала эффект
SIGHUP 1 Вешать трубку
SIGINT 2 Прерывание с клавиатуры
SIGKILL 9 Убить сигнал
SIGTERM 15 Сигнал о завершении

Запуск и уничтожение определенных процессов

Вероятно, самый простой способ убить pkill процесс - это выбрать его через имя процесса, как в следующем примере, используя команду pkill как

pkill -f test.py

(или) более безопасный способ, используя pgrep для поиска фактического идентификатора процесса

kill $(pgrep -f 'python test.py')

Тот же результат можно получить, используя grep над ps -ef | grep name_of_process затем ps -ef | grep name_of_process процесс, связанный с результатом pid (id процесса). Выбор процесса с использованием его имени удобен в тестовой среде, но может быть действительно опасным, когда сценарий используется в производстве: практически невозможно быть уверенным, что имя будет соответствовать процессу, который вы на самом деле хотите убить. В этих случаях на самом деле такой подход безопасен.

Запустите скрипт, который в конечном итоге будет убит с помощью следующего подхода. Предположим, что команда, которую вы хотите выполнить и в конечном итоге убить, это python test.py

#!/bin/bash

if [[ ! -e /tmp/test.py.pid ]]; then   # Check if the file already exists
    python test.py &                   #+and if so do not run another process.
    echo $! > /tmp/test.py.pid
else
    echo -n "ERROR: The process is already running with pid "
    cat /tmp/test.py.pid
    echo
fi

Это создаст файл в каталоге /tmp содержащий pid процесса python test.py Если файл уже существует, мы предполагаем, что команда уже запущена, и скрипт возвращает ошибку.

Затем, когда вы хотите его убить, используйте следующий скрипт:

#!/bin/bash

if [[ -e /tmp/test.py.pid ]]; then   # If the file do not exists, then the
    kill `cat /tmp/test.py.pid`      #+the process is not running. Useless
    rm /tmp/test.py.pid              #+trying to kill it.
else
    echo "test.py is not running"
fi

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

Этот последний пример может быть легко улучшен для выполнения одной и той же команды несколько раз (например, для добавления файла pid вместо его перезаписи) и для управления случаями, когда процесс умирает до его уничтожения.

Список всех процессов

Существует два распространенных способа перечислить все процессы в системе. Оба перечисляют все процессы, выполняемые всеми пользователями, хотя они отличаются в том формате, который они выдают (причина различий историческая).

ps -ef   # lists all processes 
ps aux   # lists all processes in alternative format (BSD)

Это можно использовать, чтобы проверить, работает ли данное приложение. Например, чтобы проверить, запущен ли SSH-сервер (sshd):

ps -ef | grep sshd

Проверьте, какой процесс выполняется на определенном порту

Чтобы проверить, какой процесс выполняется на порту 8080

lsof -i :8080

Поиск информации о запущенном процессе

ps aux | grep <search-term> показывает процессы, соответствующие поисковому термину

Пример:

root@server7:~# ps aux | grep nginx
root       315  0.0  0.3 144392  1020 ?        Ss   May28   0:00 nginx: master process /usr/sbin/nginx
www-data  5647  0.0  1.1 145124  3048 ?        S    Jul18   2:53 nginx: worker process
www-data  5648  0.0  0.1 144392   376 ?        S    Jul18   0:00 nginx: cache manager process
root     13134  0.0  0.3   4960   920 pts/0    S+   14:33   0:00 grep --color=auto nginx
root@server7:~#

Здесь второй столбец - это идентификатор процесса. Например, если вы хотите убить процесс nginx, вы можете использовать команду kill 5647 . Всегда рекомендуется использовать команду kill с SIGTERM а не SIGKILL .

Отключение фоновой работы

$ gzip extremelylargefile.txt &
$ bg
$ disown %1

Это позволяет продолжить процесс, как только ваша оболочка (терминал, ssh и т. Д.) Будет закрыта.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow