Потребителска SystemV-тип директория

Харесвам Линукс. Но има неща в него, които биха могли да са и по-добри.

Наскоро открих например, че ми е много удобно някои сървиси да се стартират на машината ми автоматично при пускане, и да спират при спиране. Само че не като системни, с root права и прочее, а като лично мои си, потребителски, и с възможност аз, редовият потребител, да си ги променям както си искам, без да тормозя root-а, и да ползвам неговите права.

Нещо като User Startup папката на Windows. Слагаш програмки в нея – пускат се автоматично при стартиране на системата. Много свежест само в 2 калории.

Много е лесно да я направя, но е недопустимо хилава в сравнение със SystemV-тип runlevel системата на любимия ми Debian (а и доста други дистрибуции). При нея програми се пускат при стартиране, спират при изключване, и при какви ли не още случаи. Защо и редовият юзер да няма също такава? И седнах да я реализирам, по най-груб и прост начин.

Ето ви резултата – две елементарни скриптчета. Public domain. Очаквайте да са тъпкани с бъгове и грешки, и да са на светлннни години от доброто и оптималното. Който каквото не им харесва, да ги оправи. От мен – толкова.

Първото се слага в общата runlevel система на машината. Под Debian е удобно да си направите директория /etc/rc.boot, и да сложите файлчето вътре. Основният /etc/init.d/rc ще го изпълнява автоматично след системните runlevel скриптове. Под други дистрибуции може да е удобно да го стартирате (или включите изцяло) в основния rc скрипт.

Нещото преравя директориите в /home, и ако открие в някоя изпълним файл за юзерска runlevel обработка, с определено име, го стартира. Типично в мой стил, две трети от обема са коментари:

cat /etc/rc.boot/users-startup
————–8< --------------- !/bin/bash # Written by Grigor Gatchev. Placed into the public domain. # Enables users to have own SystemV-style runlevel system. # (and the ability to overload your precious machine). # # Include this script to be executed at every runlevel change. # If an user has an appropriately named executable in their homedir, # it will be called at every runlevel switch. USER_RUNLEVEL_SCRIPT_NAME=.start-stop-user-services RUNLEVEL=$(runlevel | cut --delim=\ --fields=2) # Check all homedirs for existence of this-named script. # If present, call it as the appropriate user # (eg. the one who owns this script file.) # Use nice to decrease the potential for abuse. for HOMEDIR in /home/* ; do if [ -x $HOMEDIR/$USER_RUNLEVEL_SCRIPT_NAME ]; then username=$(ls -ls "$HOMEDIR/$USER_RUNLEVEL_SCRIPT_NAME" | cut --delim=\ --fields=5) # this above is really ugly - someone to improve it? nice -n 19 su $username "$HOMEDIR/$USER_RUNLEVEL_SCRIPT_NAME" $RUNLEVEL fi done # end of users-startup --------------8<--------------- Второто файлче потребителят може да си сложи в home директорията. Името му трябва да е това, за което ще търси първото. В най-простия случай то проверява кой runlevel му е подаден, и ако е 1 до 5, стартира юзерските програми, които трябва да се автостартират, а ако е 0 или 6, ги спира културно. В малко по-сложния (той е, който е реализиран по-долу) потребителят може да има цяла система от директории, в стил System V стартираща директория, и то да проверява в съответните директории и да пуска и спира нещата в тях. Във втория случай потребителят трябва да си направи система директории за обработка на runlevels, и да сложи в нея подходящи скриптове или линкове. В посочения по-долу скрипт, файлът се казва .start-stop-user-services (с точка отпред, за да не бъде изтрит лесно по погрешка; users-startup го търси под това име), SystemV-стил директорията се казва .runlevels, в нея са направени поддиректории rc0.d до rc6.d, и в тях се слагат стартиращите или спиращи скриптове. cat ~/.start-stop-user-services --------------8<--------------- !/bin/bash # Written by Grigor Gatchev. Placed into the public domain. # Provides an user own System V-style runlevel handling ability. # # Must be called from the system startup services, as the appropriate user. # Must be supplied the runlevel to use, and possibly the user base SystemV directory. # Start a script. startup() { action="$1" ; shift script="$1" if [ -x "$script" ]; then case "$script" in *.sh) sh "$script" $action ;; *) "$script" $action ;; esac fi } # Exec runlevel-specific scripts. exec_runlevel () { runlevel=$1 ; shift; rundir=$1 runlevel_dir="$rundir/rc$runlevel.d" if [ -d "$runlevel_dir" ] ; then # First, run the KILL scripts. for SCRIPT in "$runlevel_dir/K*" do startup stop $SCRIPT done # Then, run the START scripts. for SCRIPT in "$runlevel_dir/S*" do startup start $SCRIPT done fi } # Accept/determine the appropriate runlevel and rundir, and call execution. runlevel=$1; shift rundir="$1" # Check supplied runlevel. case "$runlevel" in 0 | 1 | 2 | 3 | 4 | 5 | 6 ) ;; * ) echo "Bad runlevel: $runlevel" >&2
exit 1
;;
esac

# Set an user default rundir, if not explicitly supplied.
if [ “$rundir” = “” ]
then
rundir=”$HOME/.runlevels”
fi

# Execute the scripts for this runlevel.
exec_runlevel $runlevel $rundir

# end of .start-stop-user-services
————–8<--------------- Това е. Enjoy.

4 thoughts on “Потребителска SystemV-тип директория

  1. spartster

    нищо не разбрах, но пък не ми е и работа. 🙂 не се заяждам – коментирам.

    Reply
  2. Григор Post author

    ще се опитам да го редактирам, така че да стане по-ясно.

    Reply
  3. zImage

    Досега не съм имал нужда от пълнокръвни init скриптове и затова съм закърпвал положението с @reboot на crontab (man 5 crontab). Няма обаче @shutdown, така че не е пълен заместител и твоето решение си важи.

    Reply
  4. Григор Post author

    Доста от сървисите, които се пускат на едно десктоп Линукс PC, не е нужно да са системни – биха могли да са потребителски. А все повече просто не бива да са системни. Така че нищо чудно решението да се окаже и полезно. 🙂

    Гледам примерно, че всички по-големи десктопи поддържат вътрешна auto-startup директория. А в юзерските нива под десктопа също има достатъчно сървиси и програми, които са едни и същи, и нужни, независимо какво пускаш отгоре…

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *