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.dpara 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/S99rebootseja criado, o qual reinicializará o sistema. - Se o arquivo
/etc/DR_Network_Configuredexistir e/etc/rc2.d/S99rebootexistir, 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