16.04를 사용하면 crontab에 다른 서버를 마운트할 수 없습니다

16.04를 사용하면 crontab에 다른 서버를 마운트할 수 없습니다

내 네트워크에는 두 개의 서버가 있고 한 서버에서 다른 서버로 일부 데이터를 전송합니다. 이 작업을 수행하기 위해 스크립트를 작성했으며 수동으로 실행하면 제대로 작동합니다. 그러나 프로세스를 자동화하기 위해 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}

파일은 755 권한을 가진 root:root가 소유합니다. (나는 그것을 강화할 수 있다는 것을 알고 있지만 여전히 실험 중입니다.)

답변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/binmount

$ which mount
/bin/mount

mount.cifs그러나 예를 들어 다음 위치에 있으므로 작동하지 않습니다 /usr/sbin.

$ which mount.cifs
/sbin/mount.cifs

해결책은 다음 중 하나입니다.

  1. 크론 작업으로 실행될 스크립트의 실행 가능 프로그램에 대해 항상 전체 절대 경로를 사용하십시오. 예를 들어

    /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

관련 정보