У меня есть два сервера в моей сети, и я переношу некоторые данные с одного сервера на другой. Я написал сценарий, чтобы выполнить это, и он отлично работает, когда я запускаю его вручную. Однако, когда я включаю его в crontab для автоматизации процесса, он не будет монтировать внешний сервер, даже если скрипт работает. Я отправляю как можно больше информации в журнал, но, не сообщается об ошибках монтирования, только тот факт, что он не подключался.
Это сценарий:
#!/bin/bash
LOGFILE="/var/log/SRV1.log"
echo $(date +%Y-%m-%d_%H:%M:%S)" --- Begins Now" | tee -a ${LOGFILE}
StartTime="$(date +%s)"
echo "Connecting to SRV1" | tee -a ${LOGFILE}
mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
файл принадлежит root: root с 755 правами доступа. (Я знаю, что смогу затянуть это, но я все еще просто экспериментирую).
Программа cron работает в очень ограниченной среде - вы можете увидеть это, например, если вы создаете crontab, содержащий
* * * * * /usr/bin/printenv > /tmp/cronenv
, а затем посмотрите на полученный файл:
$ cat /tmp/cronenv
LANGUAGE=en_CA:en
HOME=/home/steeldriver
LOGNAME=steeldriver
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/home/steeldriver
То же самое относится к root crontabs (т.е. задания, представленные с использованием sudo crontab -e):
LANGUAGE=en_CA:en
HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/root
В частности, по умолчанию PATH содержит только /bin и /usr/bin ; это было бы прекрасно для mount:
$ which mount
/bin/mount
, однако это не будет работать для mount.cifs, например, поскольку оно находится в /usr/sbin:
$ which mount.cifs
/sbin/mount.cifs
Решение также:
всегда использует полный абсолютный путь для исполняемых программ в сценариях, которые будут выполняться как задания cron; например/usr/sbin/mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
или
всегда используют полный абсолютный путь для исполняемых программ в сценариях, которые будут выполняться как задания cron; например/usr/sbin/mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
ПРИМЕЧАНИЕ. Задания, запущенные из каталога /etc/cron.d системы, имеют более обширный путь, заданный явно в /etc/crontab:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Программа cron работает в очень ограниченной среде - вы можете увидеть это, например, если вы создаете crontab, содержащий
* * * * * /usr/bin/printenv > /tmp/cronenv
, а затем посмотрите на полученный файл:
$ cat /tmp/cronenv
LANGUAGE=en_CA:en
HOME=/home/steeldriver
LOGNAME=steeldriver
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/home/steeldriver
То же самое относится к root crontabs (т.е. задания, представленные с использованием sudo crontab -e):
LANGUAGE=en_CA:en
HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/root
В частности, по умолчанию PATH содержит только /bin и /usr/bin ; это было бы прекрасно для mount:
$ which mount
/bin/mount
, однако это не будет работать для mount.cifs, например, поскольку оно находится в /usr/sbin:
$ which mount.cifs
/sbin/mount.cifs
Решение также:
всегда использует полный абсолютный путь для исполняемых программ в сценариях, которые будут выполняться как задания cron; например/usr/sbin/mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
или
всегда используют полный абсолютный путь для исполняемых программ в сценариях, которые будут выполняться как задания cron; например/usr/sbin/mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
ПРИМЕЧАНИЕ. Задания, запущенные из каталога /etc/cron.d системы, имеют более обширный путь, заданный явно в /etc/crontab:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin