Eu testei a transferência desse script de /etc/rc0.d
para /etc/rcS.d
, /etc/rc1.d
, /etc/rc2.d
e /etc/rc3.d
com os seguintes resultados:
-
/etc/rcS.d - o mesmo comportamento de
/etc/rc0.d
- / etc / DR_Network_Configured é criado, mas não ocorre nenhuma reinicialização. - /etc/rc1.d - / etc / DR_Network_Configured não é criado e não ocorre nenhuma reinicialização.
- /etc/rc2.d - / etc / DR_Network_Configured é criado e o sistema é reinicializado.
- /etc/rc3.d - / etc / DR_Network_Configured é criado e o sistema é reinicializado.
Para resumir, quando o sistema é inicializado com seu padrão ( milestone/multi-user-server:default
, semelhante ao nível de execução 3), ele executa scripts de inicialização localizados em /etc/rc0.d
, /etc/rcS.d
, /etc/rc2.d
e /etc/rc3.d
, mas não /etc/rc1.d
.
Os comandos reboot e init não funcionam quando são executados a partir de um script de inicialização em /etc/rc0.d
, /etc/rcS.d
(e possivelmente /etc/rc1.d
, embora eu não possa confirmar isso, pois o script de inicialização nesse diretório nunca foi executado). Eles funcionam quando executados a partir de scripts de inicialização em /etc/rc2.d
e /etc/rc3.d
.
Eu imagino que isso é projetado para impedir que um sistema reinicialize constantemente. Se um script de inicialização incorreto em /etc/rc2.d
ou /etc/rc3.d
colocar o sistema em um loop de reinicialização infinito, o sistema poderá ser facilmente reinicializado para o marco de usuário único e o script de inicialização incorreto será desativado em vez de precisar localizar inicialização alternativa mídia para inicializar, monte o volume / disco raiz e desabilite o script ofensivo.
Com base no acima, modifiquei meu script de reconfiguração de rede da seguinte forma:
- Mantive meu script em
/etc/rc0.d
para alterar as configurações de rede. - Adicionada uma função a ela para que, se o sistema precisar ser reinicializado após a reconfiguração da rede, um novo script
/etc/rc2.d/S99reboot
seja criado, o qual reinicializará o sistema. - Se o arquivo
/etc/DR_Network_Configured
existir e/etc/rc2.d/S99reboot
existir, remova o último para evitar que o sistema reinicialize constantemente.
Meu código relevante é:
#!/sbin/sh
reboot_script="/etc/rc2.d/S99reboot"
Create_Reboot_File ()
{
echo "#!/sbin/sh" > $reboot_script
echo "case \"\\" in" >> $reboot_script
echo "start)" >> $reboot_script
echo " init 6" >> $reboot_script
echo " exit 0" >> $reboot_script
echo " ;;" >> $reboot_script
echo "esac" >> $reboot_script
echo "exit 0" >> $reboot_script
chmod 740 $reboot_script
chown root:root $reboot_file
}
case "$1" in
start)
if [ -f /etc/DR_Network_Configured ]; then
[ -f $reboot_script ] && rm $reboot_script
exit 0
else
# My reconfigure network functions are here
# ...
touch /etc/DR_Network_Configured
Create_Reboot_File
fi
exit 0
;;
*)
echo "Usage: $0 { start }"
exit 1
;;
esac
exit 0