В Fedora Core (наблюдал лично в 2, 6 и 8), а возможно и в других дистрибутивах, при входе по su, в PATH отсутствует /sbin. Это приводит к следующему - при выполнении скриптов /etc/init.d/linux-cifs и /etc/init.d/haspd из стандартной последовательности SystemV init при загрузке или смене ранлевелов все отрабатывает нормально. При выполнении этих же скриптов из под su - ругается на lsmod/modprobe/rmmod. Решение тривиально - добавить в вызовы lsmod/modprobe/rmmod абсолютные пути, поскольку по стандарту они вроде должны быть в /sbin. Также, при вызове linux-cifs и отсутствии автоматически монтируемых по cifs ресурсов, в строке 137 функции start() происходит выполнение с ненулевым кодом возврата. Это неверно обрабатывется SysV init, т.к. при успешном запуске, скрипт должен вернуть 0. В результате создается ситуация, когда linux-cifs успешно загружен, а SysV init пишет - failed. Ориентировочные патчи прилагаются: >--- /etc/init.d/haspd 2007-12-04 17:19:53.000000000 +0300 >+++ /root/init-setup/haspd-sgc-patched 2008-01-14 14:11:44.000000000 +0300 >@@ -132,15 +132,15 @@ > chmod 660 /dev/Hardlock > fi > >- modprobe parport_pc >+ /sbin/modprobe parport_pc > > # try load module by modprobe >- modprobe $MODULENAME 2>/dev/null && { echo -n -e "\n\tmodprobe $MODULENAME" ; success ; return ; } >+ /sbin/modprobe $MODULENAME 2>/dev/null && { echo -n -e "\n\t/sbin/modprobe >$MODULENAME" ; success ; return ; } > > if [ -r "$DEFMODULEPATH" ] ; then > local INSMODF= > [ "$EXTMO" = "o" ] && INSMODF="-f" >- insmod $INSMODF $DEFMODULEPATH && { echo -n -e "\n\tinsmod $DEFMODULEPATH" ; success ; return ; } >+ /sbin/insmod $INSMODF $DEFMODULEPATH && { echo -n -e "\n\t/sbin/insmod $DEFMODULEPATH" ; success ; return ; } > #echo -n "Incorrect module. Your system: " ; uname -a ; dmesg | tail -n2 > fi > echo -n -e "$DEFMODULEPATH is not found,\nyou can try compile it with 'service haspd build' command." >@@ -239,7 +239,7 @@ > > echo -n "Unloading HASP LPT kernel module... " > is_moduled || { passed ; return ; } >- rmmod aksparlnx || { failure ; return ; } >+ /sbin/rmmod aksparlnx || { failure ; return ; } > success > > } --------------------- >--- /etc/init.d/linux-cifs 2007-10-12 21:16:36.000000000 +0400 >+++ /root/init-setup/linux-cifs.sgc-patched 2007-10-21 17:53:33.000000000 +0400 >@@ -82,7 +82,7 @@ > > is_moduled() > { >- lsmod | grep $MODULENAME > /dev/null >+ /sbin/lsmod | grep $MODULENAME > /dev/null > } > > umount_cifs() >@@ -108,16 +108,16 @@ > #test -r /proc/fs/cifs/Etersoft && { passed ; return ; } > umount_cifs > echo -n "Removing CIFS kernel module... " >- rmmod $MODULENAME || { failure ; return ; } >+ /sbin/rmmod $MODULENAME || { failure ; return ; } > fi > > # Preload module dependencies >- modprobe nls_base 2>/dev/null >+ /sbin/modprobe nls_base 2>/dev/null > # kernel depends > # || { echo -n "nls_base is not loaded" ; failure ; } > echo -n "Loading CIFS kernel module... " > if [ -r "$DEFMODULEPATH" ] ; then >- insmod $DEFMODULEPATH && { echo ; echo -n " insmod $DEFMODULEPATH" ; success ; return ; } >+ /sbin/insmod $DEFMODULEPATH && { echo ; echo -n " /sbin/insmod $DEFMODULEPATH" ; success ; return ; } > echo -n "Incorrect module. Your system: " ; uname -a ; dmesg | tail -n2 > fi > echo -n "$MODULENAME from Etersoft is not found," >@@ -135,6 +135,7 @@ > echo -n "Disable Linux extensions for CIFS..." > echo 0 > /proc/fs/cifs/LinuxExtensionsEnabled && success || failure > test -n "$WASCIFS" && mount_cifs >+ set > /dev/null #to set exit code to 0 upon return from start script > else > failure > fi >@@ -145,7 +146,7 @@ > echo -n "Unloading CIFS kernel module... " > umount_cifs > is_moduled || { passed ; return ; } >- rmmod $MODULENAME || { failure ; echo "You have to umount all CIFS resources."; return ; } >+ /sbin/rmmod $MODULENAME || { failure ; echo "You have to umount all CIFS resources."; return ; } > success > > }
При выполнении команды $ su меняется UID пользователя на 0 (root), все переменные окружения остаются пользовательскими - $HOME, $PATH и пр. В PATH для пользователя закономерно не вписаны путь к /sbin. Правильным способом является использование команды $ su - при этом происходит полноценный вход в систему под root, со всем необходимым окружением. Может быть нужно информировать пользователя, что у него неверное окружение? Исправление путей в haspd и linux-cifs я внёс, будет в следующих сборках. За код возврата из start() отдельное спасибо, также исправил.