Creé un script en /etc/init.d/ que tiene que ejecutar varios otros scripts de otros usuarios (sin privilegios de root) desde sus directorios de inicio, como si los hubieran iniciado.
Lanzo estos scripts con: sudo -b -u <username> <script_of_a_particular_user>
Y funciona. Pero por cada script de usuario que continúa ejecutándose (por ejemplo, algún perro guardián) veo un proceso de sudo padre correspondiente, aún vivo y ejecutándose como root. Esto crea un desastre en la lista de procesos activos.
Entonces mi pregunta es: ¿cómo puedo iniciar (bifurcar) otro script desde el script bash existente como otro usuario y dejarlo como un proceso huérfano (independiente)?
Explicación más detallada:
Básicamente estoy tratando de proporcionar a otros usuarios en la máquina un medio para ejecutar cosas al iniciar o apagar el sistema ejecutando archivos ejecutables que se encuentran en los respectivos subdirectorios que se encuentran en su directorio de inicio, llamados .startUp y .shutDown. Como no encontré ningún otro medio para hacerlo, escribí mi script bash que hace exactamente eso y lo configuré como un script de servicio (siguiendo el ejemplo de esqueleto) en /etc/init.d/, así que cuando se ejecuta con el argumento de inicio, inicia todo desde los directorios .startUp y cuando se ejecuta con el argumento de detención, inicia todo desde los directorios .shutDown de todos los usuarios como ellos.
Alternativamente, también estoy interesado si podría haber utilizado alguna solución existente para resolver este problema.
ACTUALIZACIÓN
He buscado un poco y encontré esta pregunta:
/unix/22478/detach-a-daemon-using-sudo
Respuesta aceptada allí, para usar:, sudo -u user sh -c "daemon & disown %1"
funciona para mí. Pero también lo intenté sin disown% 1 y es lo mismo. Entonces esto es lo que funciona para mí como esperaba:
sudo -u <username> bash -c "<script_of_a_particular_user> &"
Mi pregunta adicional ahora es, ¿por qué funciona sin rechazo? ¿Debería dejar la llamada desconocida , independientemente de algún posible caso especial?
ACTUALIZACIÓN 2
Aparentemente esto también funciona:
su <username> -c "<script_of_a_particular_user> &"
¿Hay alguna diferencia entre esta llamada y la llamada sudo? Sé que esta es potencialmente una pregunta completamente diferente. Pero dado que estoy encontrando las respuestas aquí, tal vez por el tema, alguien podría aclarar esto aquí.
ACTUALIZACIÓN 3
Ambos métodos con su o sudo ahora producen un nuevo proceso startpar (proceso único que se ejecuta como raíz) después de iniciar la máquina. Visible en la lista de procesos como:
startpar -f -- <name_of_my_init.d_script>
¿Por qué se genera este proceso? Obviamente estoy haciendo algo mal ya que ningún otro script init.d tiene este proceso ejecutándose.
ACTUALIZACIÓN 4
El problema con startpar está resuelto. He comenzado otra pregunta para eso: el
proceso startpar se quedó colgado al iniciar procesos desde rc.local o init.d
Y otra pregunta para analizar más a fondo los mecanismos de lanzamiento para usuarios no privilegiados:
proporcionar a los usuarios normales (no root) capacidades de ejecución automática de inicialización y apagado
Puede usar start-stop-daemon fuera de init.d con la
--user
opción.fuente
No he probado completamente esto, pero creo que algo así como:
al inicio y luego
cuando se apaga.
El manejo de la secuencia de comandos .shutDown podría hacerse mediante algo parecido al inicio, pero no puede estar seguro de que las secuencias de comandos se ejecuten para finalizar ya que el apagado debería ocurrir de todos modos :-)
deberías hacer el truco, tal vez deberías incluir alguna redirección de entrada, pero luego deberías preocuparte de que se llenen los archivos de registro.
fuente
¿Has intentado usar
su
?-c
le dice a su que ejecute el comando, y el último parámetro es que el usuario lo ejecute como.fuente