내 네트워크에는 두 개의 서버가 있고 한 서버에서 다른 서버로 일부 데이터를 전송합니다. 이 작업을 수행하기 위해 스크립트를 작성했으며 수동으로 실행하면 제대로 작동합니다. 그러나 프로세스를 자동화하기 위해 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
root
crontab(예: 를 사용하여 제출된 작업 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
해결책은 다음 중 하나입니다.
크론 작업으로 실행될 스크립트의 실행 가능 프로그램에 대해 항상 전체 절대 경로를 사용하십시오. 예를 들어
/usr/sbin/mount.cifs //192.168.1.200/share /media/SVR1 -o user=username,pass=pwd | tee -a ${LOGFILE}
또는
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