Bash
Работа и процессы
Поиск…
Список текущих заданий
$ 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 и т. Д.) Будет закрыта.