Configurar un trabajo cron que hace un chmod / chown


9

Me gustaría configurar un trabajo cron que recusivamente haga un chmod / chown en un directorio (el directorio de dropbox).

Esto funciona cuando ejecuto los comandos manualmente como:

sudo chown -R $USER ~/Dropbox
sudo chmod -R u+rw ~/Dropbox

Traté de convertirlo en un trabajo cron como este:

10      *       *       *       *       sudo chown -R $USER ~/Dropbox

Pero no parece hacer el trabajo.

¿Como hacer esto?


incron+ inotifyserían soluciones más limpias :)
franzlorenzon

Respuestas:


9

Desea que su script cron raíz (edite ejecutando sudo crontab -e) sea:

 55 * * * * /bin/chown -R somename /home/somename/Dropbox && /bin/chmod u+rw /home/somename/Dropbox

Suponiendo que se nombra al usuario somenamey esa /home/somename/Dropboxes la ruta completa de su directorio de Dropbox. Como usuario root, ~ va a /root.


1
Gracias por la respuesta clara! Creo que esto me muestra algunos de los enlaces faltantes que estaba buscando. Lo
probaré

Probado, y está funcionando!
tvgemert

2
Excelente; Me alegro de que esté funcionando. Las lecciones son (a) no espere que las variables ambientales $PATHse definan como equivalentes a las de un usuario que ha iniciado sesión en un cronjob (por ejemplo, en mi linuxbox $ HOME está definido, pero $ PATH está configurado para /usr/biny /bindesde crontab y $ USER no está definido; por lo tanto, en este caso no fue necesario especificar /binantes de chmod / chown), (b) evitar sudoen los scripts (ejecutar la tarea cron como rootusuario), (c) ya que el usuario raíz $HOMEse referirá a / root no a su usuario normal , (d) ~debe evitarse en los scripts cron (por defecto se ejecuta como #!/bin/sh.
dr jimbob

También recomendaría poner un guión según el consejo de David si alguna vez haces algo más complicado que esto; un script parece excesivo para una combinación de chmod / chown. Sin embargo, si comienza a aplicar en Dropbox de otros usuarios u otros directorios o decide ejecutar solo en archivos recientemente modificados (por ejemplo, resultado de find), etc., entonces tiene sentido incluir un script.
dr jimbob

16

sudodebe casi nunca se puede utilizar en las tareas programadas. Espera poder hablar con un terminal, y requiere indicadores específicos para evitar intentar hacerlo.

Cree su trabajo cron como root (en /etc/crontab- Tenga en cuenta que el formato de este archivo es ligeramente diferente:) en su lugar. Esto también tiene la ventaja de trabajar en sistemas donde no está instalado.minute hour mday month wdayusercommand
sudo


¡Gracias! Creé esto, pero todavía no estoy seguro. No obtuve el resultado esperado: 55 * * * * root chown -R somename ~/Dropbox
tvgemert

3
somenamepodría estar en cualquier parte; Es un camino relativo. En segundo lugar, ~solo se entiende por el caparazón; uso $HOME. Use un comando como este: chown -R /some/path/somename $HOME/Dropbox(esto usará rootel directorio de inicio de ...)
Mei

@David: somenameno es una ruta, sino el nombre de usuario (y también debe contener el nombre del grupo somename:somegroup
:)

55
@tvgemert Lo que David dijo anteriormente (y en su respuesta) sobre rutas / rutas relativas / rutas simbólicas ( ~) es CRÍTICAMENTE IMPORTANTE : pase un tiempo con las páginas de manual de cron y crontab y asegúrese de comprender lo que está sucediendo (si tiene dudas , crear una tarea programada que hace echo "what you want to do" > /tmp/what-i-would-runy la mirada a los resultados para asegurarse de que están en su sano juicio -. probabilidad mucho menor de destruir el universo)
voretaq7

Gracias por los consejos útiles, ya me dio más información!
tvgemert

6

Dos cuestiones:

1) Las rutas normalmente no están configuradas en cron de la misma manera que cuando inicias sesión. Prueba / usr / bin / sudo / bin / chown ... (o cualesquiera que sean las rutas correctas para esos programas en tu sistema).

2) sudo normalmente le pide su contraseña, o de lo contrario puede no estar contento corriendo de manera no interactiva. Le sugiero que coloque los comandos en el crontab de la raíz sin el sudo en su lugar, luego los comandos se ejecutan como raíz.


5

Hay múltiples problemas con su crontab:

10 * * * sudo chown -R $USER ~/Dropbox

Los problemas:

  • sudono debe usarse aquí; requiere entrada de terminal
  • chowndebe especificarse completamente (es decir, /bin/chown)
  • USERcomo una variable real puede no existir; algunos sistemas usanLOGNAME
  • ~(tilde) solo será reconocido por un caparazón; un desnudo chownno lo entenderá
  • especificando HOME en el crontab de root va a la página de inicio de root

Creo que realmente lo escribiría:

#!/bin/bash

# FILE: /usr/local/bin/myscript

USER=$1
eval chown -R $1 ~$1/Dropbox
eval chmod -R u+rw ~$1/Dropbox

(Se evalnecesita para convertir ~$1a ~user luego a /home/user).

Ejecute este script desde el crontab de root:

# root's crontab
10 * * * /usr/local/bin/myscript someuser

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.