Recientemente he tenido que reinstalar 10.9.5 (instalación por defecto) y ahora me encuentro con que los bash scripts que se ejecutan perfectamente desde la línea de comandos (~/Me...) ya no funcionan usando crontab. Uso crontab para invocar "Diskutil unmount volumeX" pero estoy recibiendo un correo de cron diciendo que el comando "diskutil" no se encuentra. Es un problema de PATH y si es así como lo solucionaría. Gracias de antemano por cualquier ayuda.
Respuestas
¿Demasiados anuncios?cron
utiliza /usr/bin:/bin
por defecto PATH
y diskutil
está en /usr/sbin
.
Especifique la ruta completa a diskutil
o añadir una línea como PATH=/usr/bin:/bin:/usr/sbin:/sbin
al inicio de su crontab.
Entre en which diskutil
para encontrar su camino, o introduzca echo $PATH
para encontrar la ruta en la que funcionan sus comandos.
Pregunta:
¿Es un problema de PATH y, si es así, cómo puedo solucionarlo?
Respuesta a "¿Es un problema de PATH?":
Lo más probable es que se trate de un "problema de PATH". Pero el verdadero problema es sin saber el verdadero valor de $PATH
que cron
utiliza. Esa es la cuestión que abordará esta respuesta.
Como usuario de cron
una de las cosas que debes entender es que aunque cron
ejecuta su crontab
instrucciones en su nombre, y bajo su identificación de usuario, lo hace dentro de un medio ambiente que como usuario "conectado".
Tal vez la forma más fácil de descubrir cuál es su entorno cuando se ejecuta un trabajo de cron
es preguntar cron
para que te lo cuenten. Eso se hace fácilmente de la siguiente manera:
% crontab -e
# in your editor, add the following line, then save & close your new crontab
* * * * * printenv > /Users/$USER/mycronenvironment.txt 2>&1
# now wait for the output:
% tail -f ~/mycronenvironment.txt
Querrás detener esto en breve, así que edita y guarda tu crontab
. El resultado se parecerá a esto:
SHELL=/bin/sh
USER=seamus
PATH=/usr/bin:/bin
PWD=/Users/seamus
SHLVL=1
HOME=/Users/seamus
LOGNAME=seamus
_=/usr/bin/printenv
Tenga en cuenta la PATH
La variable se limita a /usr/bin
& bin
. Así que - su cron
el trabajo se verá en ningún otro lugar para un archivo. Ahora puede comparar este medio ambiente contra el de su acceso interactivo shell. Simplemente ejecute printenv
desde el shell de inicio de sesión ( zsh
en modelos posteriores de Mac):
% printenv
...
PATH=/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Library/Apple/usr/bin
...
Esta diferencia en el PATH
variables de entorno explica el origen de un error de "comando desconocido" generado por cron
: el comando no está en el PATH
de la cáscara utilizada por cron
.
Respuesta a "¿Cómo lo arreglo?":
En general, hay dos métodos:
-
Utilice una especificación de ruta completa para todo en su
crontab
Por ejemplo:
/usr/sbin/diskutil unmount volumeX
-
Definir (redefinir)
PATH
en sucrontab
Y, como siempre, hay numerosas formas de hacerlo. Si quieres usar tu "usuario conectado"
PATH
como elPATH
para su "usuario cron":% echo $PATH /opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Library/Apple/usr/bin % crontab -e # copy and paste the $PATH string at the top of the file as follows: PATH=/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Library/Apple/usr/bin # save & close your `crontab` # you can re-activate the `printenv` cron job again to verify the new path
A variación sobre este enfoque podría ser el siguiente:
-
Cree un archivo llamado (por ejemplo)
~/.cronpath
-
Ponga una sola línea en este archivo:
PATH=/usr/bin:/bin:<other folders>
donde <otras carpetas> es una lista separada por dos puntos de las carpetas que desea añadir a la carpeta por defectoPATH
. -
Fuente del archivo
~/.cronpath
al reiniciar en sucrontab
:@reboot . /Users/$USER/.cronpath
...
remainder of crontab entries
-