Невозможно смонтировать другой сервер в crontab с 16.04

Невозможно смонтировать другой сервер в crontab с 16.04

У меня в сети два сервера, и я переношу часть данных с одного сервера на другой. Я написал скрипт для этого, и он отлично работает, когда я запускаю его вручную. Однако, когда я включаю его в 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. (Я знаю, что могу это ужесточить, но я пока только экспериментирую).

решение1

Программа 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

То же самое относится к rootcrontab-файлам (т. е. заданиям, отправленным с помощью 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

Решением может быть:

  1. всегда используйте полный абсолютный путь для исполняемых программ в скриптах, которые будут запускаться как задания cron; например

    /usr/sbin/mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
    

или

  1. добавьте подходящее PATHзадание в начало таких скриптов, например

    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    

ПРИМЕЧАНИЕ: Задания, запускаемые из системного /etc/cron.dкаталога, имеют более обширный путь, явно заданный в /etc/crontab:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Связанный контент