Харесвам Линукс. Но има неща в него, които биха могли да са и по-добри.
Наскоро открих например, че ми е много удобно някои сървиси да се стартират на машината ми автоматично при пускане, и да спират при спиране. Само че не като системни, с 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.
нищо не разбрах, но пък не ми е и работа. 🙂 не се заяждам – коментирам.
ще се опитам да го редактирам, така че да стане по-ясно.
Досега не съм имал нужда от пълнокръвни init скриптове и затова съм закърпвал положението с @reboot на crontab (man 5 crontab). Няма обаче @shutdown, така че не е пълен заместител и твоето решение си важи.
Доста от сървисите, които се пускат на едно десктоп Линукс PC, не е нужно да са системни – биха могли да са потребителски. А все повече просто не бива да са системни. Така че нищо чудно решението да се окаже и полезно. 🙂
Гледам примерно, че всички по-големи десктопи поддържат вътрешна auto-startup директория. А в юзерските нива под десктопа също има достатъчно сървиси и програми, които са едни и същи, и нужни, независимо какво пускаш отгоре…