Чтобы обеспечить автоматический запуск какого-нибудь сервиса, нужно создать сценарий для его запуска и поместить его в каталоге /etc/init.d. Затем, в зависимости от уровня выполнения, в каталоге /etc/rcN.d нужно создать символические ссылки на этот сценарий для его запуска и останова.
Если вы хотите сами создать сценарий для запуска своего демона, можете воспользоваться шаблоном, приведенным в листинге 9.3.
Листинг 9.3. Шаблон для запуска демона
#!/bin/bash
#
# Подключаем библиотеку функций
. /etc/init.d/functions
#
# Определяем параметры
case "$!" in
start)
# Запуск демона
echo "Starting my_daemon..."
daemon my_daemon
touch /var/lock/subsys/my_daemon
;;
stop)
# Останов демона
killproc my_daemon
rm -f /var/lock/subsys/my_daemon
rm -f /var/run/my_daemon.pid
;;
status)
# Выводим статистику работы
;;
restart | reload)
# действия, выполняемые при перезагрузке демона
;;
*)
# Произошел вызов без параметров
echo "Usage: my_daemon {start|stop|status|restart|reload}"
exit 1
esac
exit 0
После того, как в процессе инициализации системы будет выполнен загрузочный сценарий уровня но умолчанию, последним выполняется сценарий /etc/rc.local
. Выполнив все сценарии, init переходит к другим записям в /etc/inittab
, относящимся к текущему уровню. Обычно там остаются только перезапускаемые (respawn) действия: процессы, которые init запускает в фоне, а когда какой-нибудь из них завершается, запускает вновь. Так ведут себя процессы *getty, обслуживающие виртуальные консоли, и менеджер дисплеев системы X Window. Инициализация системы считается законченной, когда запушены все перезапускаемые процессы и init остается только следить за ними.
9.2. Команды управления процессами
9.2.1. Иерархия процессов: ps и pstree
О том, что команда ps позволяет просмотреть сведения обо всех процессах, протекающих в системе в данный момент, вы уже знаете (п.3.2). С ключом -f эта команда выводит как PID самого процесса, так и PPID его родителя, то есть по ее выводу можно восстановить всю структуру дерева процессов до их общего предка — процесса init. «Древовидный» взгляд может понадобиться, например, если вам нужно уничтожить целую группу процессов, происходящих от общего предка: в этом случае вы можете не убивать их по очереди, а просто послать сигнал TERM их родительскому процессу.
Команда pstree представляет дерево процессов сразу в наглядном виде:
$ pstree
init┬acpid
├atd
├bonobo-activati
...
├crond
├gconfd-2
├gdm-binary──gdm-binary┬X
│
└gnome-session
├gnome-panel
├gnome-settings-
├gnome-terminal┬bash─pstrее
│
├bash─su─bash─man─sh─sh—i┬less
│ │ └─nroff—iconv
│
├bash─su─bash
│ └gnome-pty-helpe
...
├syslogd
├udevd
└xinetd
Ключ -p выводит вместе с именем процесса его PID, а ключ -u — имя пользователя, запустившего процесс. Если в качестве аргумента указать PID, то команда выведет не все дерево, а только ветку потомков процесса с этим PID. Имя пользователя в качестве аргумента требует вывести все ветки процессов, запущенных этим пользователем: у них общего предка может и не быть.
9.2.2. Информация о ресурсах системы: команды free, df, du
Команда free показывает общее количество занятой и свободной памяти: физической, в разделе подкачки и в буферах ядра. По умолчанию объем памяти выводится в килобайтах, а ключи -b и -m позволяют измерять его в байтах и мегабайтах соответственно.
Ключ -s <число> требует опрашивать систему непрерывно, через каждые <число> секунд, пока вы не прервете выполнение команды, нажав Ctrl+С.
Команды df (
Утилита df выводит сведения о дисковом пространстве на всех смонтированных в данный момент файловых системах — как локальных, так и сетевых:
$ df
Файловая система 1K-блоков Исп Доступно Исп% смонтирована на
/dev/hda4 22200824 4630864 16442200 22% /