Комп загружается, и тут встает задача - на разных этапах загрузки, запускать какие-то свои пользовательские программы. Далее бегло попытаюсь посмотреть, как это работает у меня.
Тут относительно просто, и уже все рассмотрено в интернетах, но пару слов скажу.
После того как ядро загрузилось, оно передает (в общем случае) управление пользовательскому процессу init (обычно /sbin/init), который дальше запускает необходимые скрипты, соотвутствующие разным уровням запуска (знаменитые run-levels1)). Какие скрипты будут запускаться, определяется в файле /etc/inittab, там же определяется какой ran-level будет использован для запуска, по умолчанию (его можно передать через команду загрузки ядра), в классической схеме, это - 3. В модных дистрибутивах, это - 5.
Hint: man inittab
Скрипты запуска, указанные в конфиге init, обладают своей логикой, в зависимости от дистрибутива, в большинстве своём, реализуют схему загрузки в стиле SysV (Mandriva (ex. Mandrake), Fedora (ex. RedHat), AltLinux, ASPLinux и им подобные) или BSD-like (типа Slackware, ещё примеров не приведу). Часто схему трудно определить, например в моём любимом ArchLinux: вроде просто набор скриптов в /etc/rc.d, но управляются порядком запуска удобно через /etc/rc.conf.
Обычно скрипты, запускаемые лежат в /etc/rc.d или /etc/init.d, как их запускать в различных ранлевелах, рассказывать не моя задача, хочу сказать, что так или иначе, всегда есть специальный скрипт с именем /etc/rc.local, или /etc/rc.d/local, или /etc/init.d/local или различные вариации на эту тему (интересно для своего дистрибутива - поищите в http://google.com/linux). Этот скрипт нужен, что бы пользователь прописал туда свои команды, которые нужно выполнить при загрузке. В некоторых системах существует скприт rc.local.shutdown, который выполняется при выключении или перезагрузке, поищите его у себя.
Справедливости ради, стоит отметить, что схемой init/SysV/BSD схемы загрузки не ограничиваются, у меня на сервере, допустим, дополнительно используется daemontools для управления автоматическим подключением по pppoe2). Данный механизм относится к асинхронной загрузке + перезапуск сервиса в случае его краха. Кроме того, существуют варианты загрузки с зависимостями (в ArchLinux существуют только базовые средства для определения зависимостей), когда запускаемый процесс определяет, что ему нужно для работы ещё какие-то процессы и автоматически пытается их загрузить. В общем, тут есть что почитать для общего развития, для начала - про свой дистрибутив.
Подытоживая: при начальной загрузке в ArchLinux, пользовательские команды можно прописать в файл /etc/rc.local, команды, выполняемые при выключении/перезагрузки можно прописать в /etc/rc.local.shutdown. Обратите внимание: это файлы можно править только от root'а, и команды из них выполняются только от пользователя root, соответственно, если нужно понизить привилегии, используйте команды:
su - <USER> <COMMAND>
или
sudo -u <USER> <COMMAND>
Я не буду рассматривать вариант непосредственного запуска в уровень 5 - запуск графической системы. Если случаются какие проблемы, легче их поглядеть для начала в консоли. Но это моя философия.
Итак, вы загрузились, у вас на экране приглашение ввести логин и пароль. Задумываемся, а как сделать так, что бы команды выполнялись после ввода логина и пароля…
Тут немного отвлечемся.
У каждого пользователя или через /etc/passwd или через ldap или ещё какую пень-колоду но задана командная оболочка, в народе - шел3), после успешной проверки имени и пароля, собственно и запускается для пользователя эта его оболочка. В качестве её можно, впринципе, прописать что угодно, есть даже такие команды замечательные: /bin/false или /bin/true, которые можно прописать, и пользователь никогда не войдет в систему (например, ему доступна только почта, удаленно, зачем ему давать локальный файловый доступ?) или rssh - оболочка для ограниченного доступа по ssh, если хотим, что бы пользователь мог заливать себе файлы, но не мог зайти в командный режим (понятно, ога, мне самому не поятно
)
В общем, при запуске, оболочка считывает настройки и выполняет команды, например bash:
Вышеперечисленные файлы, кроме .bashrc, выполняются только когда оболочка bash запускается как login-shell (с параметром -l), т.е. или сразу после ввода логина и пароля, или когда принудительно запущена как 'bash -l'
.bashrc выполняется каждый раз, когда запускается копия шела, а это происходит, например, когда запускается терминал (xterm, termit, konsole, gnome-terminal и пр.). Удобно сюда запихать вызов команд fortune и celebrat или cowsay наблюдать забавные фортунки и нотификации:
cowsay `date` `uname -a` echo celebrat echo fortune ru echo
вот что имеем в итоге:
______________________________________
/ Fri Oct 30 10:23:42 VLAT 2009 Linux \
| gaz_eeepc 2.6.31-ARCH #1 SMP PREEMPT |
| Fri Oct 23 11:12:58 CEST 2009 i686 |
| Intel(R) Atom(TM) CPU N270 @ 1.60GHz |
\ GenuineIntel GNU/Linux /
--------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Meeting at the LUG tomorrow.
День военной разведки РФ six days from now.
Рyкописи, может быть, и не горят. Зато диски С отлично форматирyются.
Когда login-shell закрывается (набрали exit или logout) выполняются команды из файла ~/.bash_logout
Теперь дошла очередь до загрузки иксов.
И вновь нам нужно что-то как-то запустить. Я опишу свой случай, когда используется такая связка: staybox + openbox.
Для начала базовый функционал, который предоставляет сами иксы:
Первые два игнорируются, когда в домашней директории есть файлик ~/.xinitrc, так что, если вы рулите иксами через него, подцепляйте системные из /etc/X11/xinit/xinitrc.d:
source /etc/X11/xinit/xinitrc.d/*
Если команда не отцепляется от терминала, то обязательно ставьте & в конце команды, некоторые команды можно запускать отложенно при помощи такого фокуса:
(sleep 5; command ) &
В конце файла ~/.xinitrc всегда должна стоять команда
exec <ваш оконный менеджер или DE>
без всяких & в конце.
Пример моего файла, некоторые команды закоментированы (исторически сложилось :))
#!/bin/sh # # ~/.xinitrc # # Executed by startx (run your window manager from here) # # http://www.linux-archive.org/debian-kde/20524-fish-ssh-kioslave-doesnt-work.html export KDE_FORK_SLAVES=true xhost +127.0.0.1 xhost +localhost #kdeinit & #gnome-settings-daemon & #asusosd & #noteo & xscreensaver -nosplash & xrdb ~/.Xdefaults #gkrellm & #osmo & #xfce4-power-manager xbindkeys #wicd-client #icewmtray & (sleep 5; sbxkb) & #numlockx #blueman-applet & # regenerate menu #mmaker -f -t xfterm icewm & #nvidia-settings -a InitialPixmapPlacement=2 source /etc/X11/xinit/xinitrc.d/* #gnome-keyring-daemon -d exec ck-launch-session staybox-session #exec openbox-session #icewm-session # exec icewm #exec startkde # exec blackbox # exec fluxbox #exec startxfce4 #exec afterstep #exec xterm ################################################################## # For LXDE only ################################################################## # Корректор клавиатурного ввода, индикатор раскладки #gxneur & # Мыльный нотификатор #mail-notification & #gnubiff --systemtray --nogui & #exec startlxde #exec xterm #exec /usr/share/antico/antico
Всякие менеджеры сессий, которые являются неотъемлемой частью различных DE: KDE, Gnome, XFCE, LXDE и т.п. или используемый мною Staybox для собственного окружения, так же читают .desktop файлы из директорий:
Кроме того, у Staybox есть файл ~/.config/staybox/autostart в который можно в специальной форме прописывать команды, так если перед именем команды ставить @, то менеджер будет следить за ним, и, если он рухнет - перезапускать.
У меня в этом файле прописано:
@lxpanel @pcmanfm -d dbus-launch nm-applet
Staybox после запускает оконный менеджер, по умолчанию это OpenBox. У него тоже свои средства для запуска приложений, это файл: ~/.config/openbox/autostart.sh
Для оконного менеджера IceWM, файлом запуска будет ~/.icewm/startup
Хочется отметить, что в случае использования xdm/gdm/kdm/slim или им подобным графическим менеджерам входа в систему, стадия пользовательского .xinirc пролетает, и там следует отдельно читать как выполнить свои команды, но я данный подход не использую, поэтому особо и не страдаю.
На этом пожалуй все, если у кого есть что дополнить - комменты ждут.
Дискуссия
Интересный процесс. Хотя я думал будет короче… о_О
ну главное, что интересно :)