Процессы.

Основы работы с Linux. -> Управление процессами.

Управление процессами.

Процесс в Linux (как и в UNIX) - это программа, которая выполняется в отдельном виртуальном адресном пространстве.

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

Linux поддерживает параллельное (или квазипараллельного при наличии только одного процессора) выполнение процессов пользователя.

Ядро предоставляет системные вызовы для создания новых процессов и для управления порожденными процессами.

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

В связи с развитием SMP (Symmetric Multiprocessor Architectures) в ядро Linux был внедрен механизм нитей или потоков управления (threads). Нить - это процесс, который выполняется в виртуальной памяти, используемой вместе с другими нитями процесса, который обладает отдельной виртуальной памятью.

Каждый процесс реагирует на сигналы и, естественно, может установить собственную реакцию на сигналы, производимые операционной системой.

Сигнал - способ информирования процесса ядром о происшествии какого-то события.

Примеры сигналов:

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

Для создания процессов используются два системных вызова: fork() и exec. fork() создает новое адресное пространство, которое полностью идентично адресному пространству основного процесса. После выполнения этого системного вызова мы получаем два абсолютно одинаковых процесса - основной и порожденный. Функция fork() возвращает PID (Process ID - идентификатор порожденного процесса) - в основном. PID - это целое число.

С помощью команды kill можно сгенерировать сигнал завершения процесса и передать его конкретному процессу по его PID.

Когда вы выполняете команду “kill”, то фактически вы посылаете системе сигнал, чтобы заставить ее завершить некорректно ведущее себя приложение.

Вы можете просмотреть все сигналы с помощью команды:

kill -l

Синтаксис использования “kill”:

kill [сигнал или опция] PID

Сигнал по умолчанию (если он не задан) - SIGTERM. Если он не помогает, для принудительного завершения процесса можно использовать следующие варианты:

$ kill SIGKILL PID
$ kill -9 PID

Если вы не знаете точно PID приложения, просто запустите команду:

ps ux

top

Команда ps позволяет сделать как бы “моментальный снимок” процессов, запущенных в системе. В отличие от ps команда top отображает состояние процессов и их активность “в реальном режиме времени”.

Полезные комбинации.

+ — сортировка по PID; + — сортировать процессы по возрасту; +

— сортировать процессы по использованию ЦПУ; + — сортировать процессы по использованию памяти; + — сортировка по времени выполнения.

Pkill

Команда “pkill” позволяет использовать расширенные шаблоны регулярных выражений и другие критерии соответствия. Вместо использования PID вы теперь можете завершить приложение, введя имя его процесса. Например, для завершения работы Firefox просто введите команду:

pkill firefox

Killall

Killall также использует имя процесса вместо PID и завершает все экземпляры процесса с этим именем. Например, если вы запустили несколько экземпляров Firefox, вы можете завершить их все с помощью команды:

$ killall firefox

Запустить программу в фоновом режиме можно с помощью конструкции <команда> &

Например такой скрипт timer.py.

import time

while True:
    time.sleep(1)
    print(time.time())

Может быть запущен в фоновом режиме командой:

python timer.py &
Основы работы с Linux. -> Файловая система.

Консоль. Работа с файловой системой.

pwd

Получение текущей директории.

cd

Смена каталога.

Может использоваться без параметров для перехода в домашний каталог.

mkdir [options]

Создание директории.

mkdir /home/ryan/foo
mkdir ./blah
mkdir ../dir1
mkdir ~/linuxtutorialwork/dir2

Мы можем использовать абсолютные и относительные пути.

Мы можем использовать .. для создания каталогов на уровне выше текущего каталога.

Мы можем использовать префикс ~ для обозначения домашнего каталога.

Полезные опции.

-p - говорим о том, что хотим создать родительские каталоги если их нет.

-v - подробный вывод что происходит.

rmdir [options]

Удаление директорий.

Опции аналогичные с mkdir.

touch [options]

Создание пустого файла.

cp [options]

Копирование файла или директории.

cp /home/ryan/linuxtutorialwork/example2 example3
cp example2 ../../backups
cp example2 ../../backups/example4
cp /home/ryan/linuxtutorialwork/example2 /otherdir/foo/example5

При копированиифайла он создастся с новым именем, указанным в source.

При копировании директории, она будет скопирована со всеми файлами с теми же именами но необходимо использовать ключ -r.

mv [options]

Перемещение файлов и директорий.

Работает так же как cp но при перемещении директории не обязательно использовать ключ -r.

rm [options]

Удаляет файлы и не пустые директории.

Для того, чтобы удалить не пустую директорию используется ключ -r.