Home Linux Vivir sin /etc/rc.local . Ejecutar un script en un servidor Ubuntu 18.04 al realizar un reboot del sistema.

Vivir sin /etc/rc.local . Ejecutar un script en un servidor Ubuntu 18.04 al realizar un reboot del sistema.

by José Luis Sánchez Borque

Uno de los problemas con que nos encontramos en las nuevas distribuciones de Debian y Ubuntu es la desaparición del archivo /etc/rc.local.

En dicho archivo un administrador de sistemas solía colocar los comandos o llamadas a scripts que se querian ejecutar al arrancar el sistema. Es posible a día de hoy seguir utilizando el archivo /etc/rc.local. Basta una simple búsqueda por internet y encontraréis multiples tutoriales para poder seguir utilizando /etc/rc.local.

En este breve Post os explicaré como sin necesidad de recurrir a instalar nada, podemos ejecutar un script al realizar un reboot del sistema.

Para ello utilizaremos el daemon cron que viene con cualquier sistema Linux.

Cron es un administrador regular de procesos en segundo plano (demonio) que ejecuta procesos o guiones (scripts ) a intervalos regulares (por ejemplo, cada minuto, día, semana o mes). Los procesos que deben ejecutarse y la hora en la que deben hacerlo se especifican en el fichero crontab. El nombre cron viene del griego chronos (χρόνος) que significa “tiempo”.

Todas las tareas que hagamos a continuación están realizadas bajo el  usuario root del sistema o con permisos similares.

Empezaremos por ve si el servicio de cron está activo con la orden systemctl.

root@mytcpip:~# systemctl status cron.service
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: ena
Active: active (running) since Tue 2019-05-07 14:39:40 PDT; 4min 52s ago
Docs: man:cron(8)
Main PID: 463 (cron)
Tasks: 1 (limit: 2297)
CGroup: /system.slice/cron.service
└─463 /usr/sbin/cron -f

May 07 14:39:40 mytcpip systemd[1]: Started Regular background program processin
May 07 14:39:40 mytcpip cron[463]: (CRON) INFO (pidfile fd = 3)
May 07 14:39:40 mytcpip cron[463]: (CRON) INFO (Running @reboot jobs)
May 07 14:39:40 mytcpip CRON[475]: pam_unix(cron:session): session opened for us
May 07 14:39:40 mytcpip CRON[475]: pam_unix(cron:session): session closed for us

Vamos a plantearnos el siguiente supuesto. Queremos ejecutar el script /etc/fw/fw.sh. Que podría ser por ejemplo las lineas del firewall de nuestro servidor realizadas con iptables.  Para nuestra prueba de concepto el contenido del script /etc/fw/fw.sh será una línea que crea la siguiente carpeta /tmp/poc.

Hay que tener presente que la carpeta /etc/fw hay que crearla, no es propia del sistema.

root@mytcpip:~# cat /etc/fw/fw.sh
mkdir /tmp/poc

Vosotros podéis sustituir el contenido por lo que más os convenga.

Debemos asegurarnos que el script tiene los permisos adecuados de ejecución:

root@mytcpip:~# chmod +x /etc/fw/fw.sh
root@mytcpip:~# ls -la /etc/fw/fw.sh
-rwxr-xr-x 1 root root 16 May 7 14:27 /etc/fw/fw.sh

Y ahora solo nos queda invocar a la orden crontab para la gestión del servicio cron.

root@mytcpip:~# crontab -e

La primera vez os pedirá seguramente el editor de textos que queremos utilizar.. En mi caso nano.

El fichero inicialmente estará vacio. Bastará con utilizar la directiva @reboot añadiendo la línea

@reboot /etc/fw/fw.sh

Veamos el fichero entero, prestando especial atención a la última linea. El resto con comentarios.

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command

@reboot /etc/fw/fw.sh

Pues ya está todo… Si realizamos un reboot del sistema comprobaremos que el script se ha ejecutado al ver que la carpeta /tmp/poc se ha creado.

root@mytcpip:~# ls /tmp/ -la
total 48
drwxrwxrwt 12 root root 4096 May 7 15:03 .
drwxr-xr-x 22 root root 4096 May 4 23:15 ..
drwxr-xr-x 2 root root 4096 May 7 15:01 poc

En el log del sistema también podemos ver que se ha ejecutado buscando con grep CRON en /var/log/syslog

root@mytcpip:~# grep CRON /var/log/syslog
...
...
...
May 7 15:01:53 mytcpip cron[465]: (CRON) INFO (pidfile fd = 3)
May 7 15:01:53 mytcpip cron[465]: (CRON) INFO (Running @reboot jobs)
May 7 15:01:53 mytcpip CRON[484]: (root) CMD (/etc/fw/fw.sh)

Espero os haya parecido interesante.

You may also like

3 comments

Javier Adrián May 17, 2019 - 2:58 pm

Buen tutorial José Luis me ha encantado la explicación sencilla y tal. Habría que poner que creas el directorio fw y luego dentro el archivo .sh ya que directamente si haces un cat sin hacer lo previo … jejeje.

Saludos de Javier Adrián

Reply
José Luis Sánchez Borque June 14, 2019 - 4:40 pm

Gracias Javier, gracias por tu indicación del /fw… lo añado.

Reply
José Luis Sánchez Borque September 23, 2019 - 9:39 am

Gracias Javi!!

Reply

Leave a Comment