
Así que he estado intentando /etc/rc.local
ejecutar el script y, por mi vida, nada parece funcionar. Puedo ejecutarlo manualmente usando service rc.local start
, y simplemente repite "hola" en un archivo en mi directorio de inicio, pero al reiniciar no se ejecuta. Todos los permisos correctos parecen estar configurados y existen enlaces en los directorios rc#.d correctos. Como referencia, aquí está la información relevante:
# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 45 Apr 12 21:10 /etc/rc.local
# ls -l /etc/init.d/rc.local
-rwxr-xr-x 1 root root 812 Apr 12 21:00 /etc/init.d/rc.local
# for i in {0..6}; do cd rc$i.d ; pwd; ls -l |grep rc.local; cd ..; done
/etc/rc0.d
lrwxrwxrwx 1 root root 18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
/etc/rc1.d
lrwxrwxrwx 1 root root 18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
/etc/rc2.d
lrwxrwxrwx 1 root root 18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc3.d
lrwxrwxrwx 1 root root 18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc4.d
lrwxrwxrwx 1 root root 18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc5.d
lrwxrwxrwx 1 root root 18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc6.d
lrwxrwxrwx 1 root root 18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
# cat /etc/rc.local
#! /bin/bash
echo hi > ~user/test
exit 0
Intenté eliminar ambos /etc/rc.local
y /etc/init.d/rc.local
ejecutarlos update-rc.d rc.local remove
, luego restaurarlos y ejecutarlos update-rc.d rc.local defaults
como en esta pregunta:Rc.local no se ejecuta. Eso no funcionó.
Tampoco funciona después de reiniciar o ingresar a cualquier nivel de inicio. No funcionó cuando la línea shebang decía #! /bin/sh -e
o #! /bin/bash
. Sin embargo , si lo ejecuto manualmente puedo hacer que los scripts /etc/rc.local
y /etc/init.d/rc.local
se repitan en diferentes archivos.
Entonces mi pregunta es... ¿qué estoy haciendo mal y cómo puedo hacer que se ejecute rc.local? Además, aunque no me importa escuchar sobre alternativas (como advenedizo), solo aceptaré una respuesta que me muestre (o me ayude a encontrar) cómo hacer que rc.local se ejecute normalmente (e idealmente me diga qué salió mal).
Aquí hay información adicional por lo que vale:
# dmesg | grep "Linux version"
[ 0.000000] Linux version 3.5.0-17-generic (buildd@allspice) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 (Ubuntu 3.5.0-17.28-generic 3.5.5)
# cat /proc/version
Linux version 3.5.0-17-generic (buildd@allspice) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012
# lsb_release -a
No LSB modules are available.
Distributor ID: LinuxMint
Description: Linux Mint 14 Nadia
Release: 14
Codename: nadia
Respuesta1
El problema es que en esta línea:
echo hi > ~user/test
~user
no se está expandiendo como esperabas. rc.local
se está ejecutando, pero debido a la expansión inesperada está intentando escribir en algún lugar para el que probablemente no tiene permiso.
Pruebe lo siguiente en su lugar:
echo ~user/test > /dev/shm/test
Luego verifique el contenido de /dev/shm/test
. Esto mostrará qué rc.local
se ejecuta y a qué se está expandiendo ~user
.
Aunque mi recomendación sería utilizar rutas explícitas, en lugar de depender del entorno externo.
Respuesta2
"No me importa oír hablar de alternativas (como advenedizo)" implica que no entiendes un par de cosas. No soy un usuario mint, pero aparentemente es un sistema advenedizo. Upstart es un demonio de inicio y su sistema solo tiene uno instalado. Así que el advenedizo no es una alternativa; no hay alternativas -su sistema usa advenedizo. Período. No utiliza nada más. Sin embargo, upstart incluye compatibilidad con versiones anteriores de scripts sysvinit, lo que significa que puede administrar servicios colocando enlaces en los directorios /etc/rc y usando algunos de los comandos antiguos como service
y quizás update-rc.d
.
Como usted mismo admite que no comprende mucho cómo funciona el sistema sysvinit, creo que es una pérdida de tiempo que aprenda. También podrías aprender cómo funciona tu demonio de inicio real. Upstart es bastante sencillo; tenga en cuenta que el 95% de las quejas que surgen al respecto (y las quejas paralelas sobre systemd en sistemas derivados de fedora) son solo personas que tienen una comprensión simple de sysvinit y están enojadas porque quizás tengan que pasar un par de horas aprendiendo algo. nuevo.
Entonces, diría que revise los directorios rc, etc., para ver los enlaces de estilo sysvinit, pero por el aspecto de la pregunta "Rc.local no se ejecuta" que vinculó a cuya solución dice que falló, creo que está perdiendo el tiempo. con eso en este momento. Olvídese de la compatibilidad con sysvinit y de los directorios /etc/rc e init.d.
Upstart procesa .conf
archivos en /etc/init
(nota: no en init.d). Entonces, si tiene algún script que desea ejecutar en el arranque, simplemente agregue un archivo .conf a /etc/init. No es necesario que sea ejecutable, pero debe ser propiedad del root.
author "You"
start on started local-filesystems
script
/etc/rc.local # but don't really be this lazy, see below
end script
Para evitar futuras confusiones y más travesuras de sysvinit, le recomiendo que cambie el nombre del script /etc/rc.local a otro, o mejor aún, simplemente mueva lo que contiene al archivo .conf (todo lo que esté entre las etiquetas script
y end script
se procesa por el caparazón).
La referencia definitiva para advenedizo es probablementeel libro de cocina advenedizo. Como dije, es una mejora, en cuanto a facilidad de uso, de sysvinit, pero desafortunadamente todavía hay escasez de material decente al respecto en línea y muchas cosas confusas e incompletas. Pero ejecutar un script en el arranque es tan simple como se acaba de describir.
Si el archivo .conf se llama "my-localboot.conf", puede probar su servicio con
initctl start my-localboot