Estoy usando trabajos de instancia advenedizos para iniciar algunos de mis servicios. Los trabajos deben tener una instancia por usuario, es decir, toman el nombre de usuario como parámetro de instancia. También los he configurado para que los reaparezca el advenedizo. La reaparición funciona. Así es como se ve mi archivo de configuración
start on runlevel [2345]
stop on runlevel [06]
normal exit 0
respawn
respawn limit 5 300
instance $user
chdir /home/talha/syncservice/
script
exec python sync.py $user
end script
El problema es que quiero que estos trabajos de instancia se reinicien al reiniciar el sistema. Obviamente no puedo pasar todos los nombres de usuario como parámetros de instancia al reiniciar, ya que no sé qué ni cuántas instancias se generaron la última vez.
¿Hay alguna manera de que el advenedizo pueda conservar sus tablas de estado, por ejemplo, trabajos durante los reinicios? ¿Por qué supongo que hay alguna "tabla de estado"? Es porque supongo que advenedizo mantiene un seguimiento de todos los trabajos de instancia en ejecución. Habría una tabla de estado que rastrea qué instancia reaparecer cuando falla. De lo contrario, no podrá reaparecer un trabajo de instancia. Entonces, si esas tablas se pueden hacer persistentes durante los reinicios, mi problema se resolverá.
¿Se puede lograr la persistencia de alguna manera? ¿Dónde mantiene el advenedizo el seguimiento de sus trabajos en ejecución? ¿Está sólo en la memoria o en un archivo?
Si eso no se puede hacer, eso significa que la estrofa
start on runlevel[2345]
no tiene significado ni beneficio, por ejemplo, empleos.
Respuesta1
Puede guardar la lista de usuarios en un archivo (user-sync.list en este ejemplo). Para restaurar los scripts de usuario, puede usar un bucle for en un script bash que ejecuta root en el arranque. Donde su script de inicio se llama sincronización de usuario:
#!/bin/sh
# /root/restore-user-sync.sh
for user in `cat user-sync.list`; do start user-sync user=$user; done
Agregue eso a crontab, como root:
$ crontab -e
En el archivo cron:
@reboot /root/restore-user-sync.sh
Mantener la lista de usuarios activos es la parte más complicada. Podrías hacer que el script de Python haga eso, o podrías hacerlo como parte del script Upstart:
# /etc/init/user-sync.conf
start on runlevel [2345]
stop on runlevel [06]
normal exit 0
respawn
respawn limit 5 300
instance $user
chdir /home/talha/syncservice/
pre-start script
# if $user doesn't already exist in list, add $user to list
if ! grep $user user-sync.list; then echo $user >> user-sync.list; fi
end script
script
exec python sync.py $user
end script
pre-stop script
# remove line(s) from list that exactly match $user
sed -i "/\b$user\b/d" user-sync.list
end script
Es posible que puedas sustituir $USER (que se define automáticamente como el nombre de usuario actual) por $user; de lo contrario, cuando llames al script inicial necesitarás pasar el nombre de usuario como parámetro:
sudo start user-sync user=myusername
Respuesta2
Definitivamente me alejaría de meterme bajo el capó de un advenedizo. Puedes hacer esto de otra manera.
ElSección del libro de cocina sobre la estrofa de instancia.tiene algún ejemplo de cómo hacer cosas como esta. Hago algo como esto con múltiples instancias de PostgreSQL; veresterespuesta.
La idea básica aquí es crear lo que yo llamo un trabajo de "motor pony" que inicie todos los trabajos de instancia. En su caso, puede hacer que itere a través de los subdirectorios de /home
o mantener un archivo conf separado que enumere los usuarios para los que desea que se ejecute el servicio. Para cada usuario, inicie una instancia de sync.py.
Tiene razón en que start on
/ stop on
es inútil en el trabajo de instancia. Muévalo al trabajo "motor pony".
Lamentablemente, no tengo acceso a una máquina de Linux en este momento, pero consulte la respuesta antes mencionada para ver ejemplos.