
Hago esta pregunta después de destruir majestuosamente una máquina Linux. Déjame darte algunos antecedentes para que sepas de dónde vengo.
Actualmente tengo (bueno... tenía) una caja RedHat Linux que ejecuta Apache con Phusion Passenger agregado para ejecutar aplicaciones Ruby en Apache. La aplicación actúa como un servicio para entregar archivos en caché a los quioscos del área de Cincinnati de forma regular. La aplicación web funcionó muy bien y lo único que quedaba era configurar una tarea cron para recuperar toda la información que debía almacenarse en caché y empaquetarla en algunos paquetes de actualización diferentes para enviarla a los quioscos. Para lograr esto, escribí un script Ruby que se encargaría de buscar y empaquetar datos. Para configurar la tarea cron, simplemente utilicé el crontab integrado. El guión se veía así:
#!/bin/bash
cd ../lib
ruby pdf_cache.rb
ruby pdf_prepare.rb
ruby rss_cache.rb
ruby nightly-pack.rb
cd ..
chown -R www.www *
Este script estaba ubicado en la carpeta cron y la estructura del directorio tenía este aspecto:
.
|-- cron
|-- feeds
|-- lib
| `-- trash
|-- logs
|-- nightly-packs
|-- pdf
| `-- tank
|-- public
`-- tmp
y ejecuté crontab -e
como root
con los siguientes contenidos:
0 3 * * * /usr/local/apache2/ruby_projects/kiosk/cron/schedule_job
Que debería ejecutar el script todos los días a las 3 a.m. Al día siguiente de programar esta tarea cron, recibí una sorpresa muy desafortunada. La tarea cron se ejecutó en la raíz y supongo que la mayoría de los comandos fallaron, con la excepción de chmod -R www.www *
que cambió la propiedad de todo en el sistema al www
usuario.
Mi pregunta es; ¿Cuál es la forma correcta de implementar una tarea cron y desde qué contexto se ejecuta la tarea cron? Ahora me doy cuenta de que probablemente no debería ejecutar esto con la root
cuenta, y no estoy seguro de cómo ejecutarlo con la www
cuenta, ya que ese usuario no tiene shell y no se puede acceder su
al www
usuario correctamente.
Respuesta1
Apuesto a que podrías darle al usuario un shell, simplemente limitar la capacidad de acceder a él de forma remota y sus permisos.
Las tareas cron se ejecutan bajo los usuarios que realizaron la tarea Cron, por eso se ejecuta como root
.
Respuesta2
Otra sugerencia: agregue -e
a la línea shebang scripts como este (es decir #!/bin/bash -e
). Esto hará que el script se cierre si falla algún comando. No garantiza que no tendrá sorpresas desagradables, pero evitará que el script se descarrile completamente (por así decirlo) y evitará muchos tipos de fallas de reacción en cadena.
Respuesta3
La forma correcta de hacer esto es 'su -', configure su cronjob como estos usuarios. Luego se ejecutará como este usuario. O, dependiendo del demonio cron que esté utilizando, podría tener un sexto campo para definir el usuario.
Espero que esto ayude. Hay otros trucos, pero siempre será mejor hacerlo funcionar correctamente.