У меня есть скрипт, который работает, когда я запускаю его из командной строки, но когда я планирую его с, cron
я получаю ошибки, что он не может найти файлы или команды. Мой вопрос двоякий:
Когда я планирую использовать задание cron, использует
crontab -e
ли он мой идентификатор пользователя в качестве основы для своих разрешений? Или он использует какой-то идентификатор пользователя cron и связанные с ним разрешения?Когда запускается задание cron, каков рабочий каталог? Это каталог, в котором я указываю скрипт для запуска, или другой каталог?
Вот моя работа cron:
15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh
Вот фактический скрипт:
vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
sed "s/IPADDR/$vIP_ADDR/g" template.txt > emailmsg.txt
ssmtp XXXXX@gmail.com < emailmsg.txt
Вот ошибки, которые я получаю при просмотре mail
сообщения, созданного cron
:
sed: can't read template.txt: No such file or directory
/home/xxxx/Documents/Scripts/email_ip_script.sh: line 15: ssmtp: command not found
Он не может найти, template.txt
но находится в том же каталоге, что и скрипт. Он также не может работать ssmtp
, но я могу как мой пользователь. Чего мне не хватает, чтобы заставить это работать должным образом?
источник
cron
меня есть своя собственнаяPATH
или я могу проверить моего пользователяPATH
? Я настроил ssmtp, чтобы он имел собственныйuser
иwheel
разрешающий доступ, думая, что это позволит любому использовать его (включая cron). Если это поможет, я на CENTOS 6.2ssmtp
, а в том, что ваша работа cron не находит исполняемый файл, вызываемый,ssmtp
потому что его нет в вашемPATH
. Нет такой вещи как «твой пользовательPATH
»; это настройка для процесса, а не для пользователя. Вы можете установить путь для всех ваших заданий cron, поместивPATH=…
строку в ваш crontab.´which ssmtp´ ...
type ssmtp
Если ваш cronjob является bash-скриптом, следующий файл будет записан на CD к месту вашего скрипта (при условии, что вы используете абсолютный путь в своем определении cron):
источник
Чтобы ответить на вопрос 1: если вы работаете
crontab -e
как собственный пользователь, задания будут запланированы в crontab этого пользователя и, таким образом, будут выполняться с разрешениями этого пользователя.Но вы должны учитывать, что задания будут выполняться в неинтерактивной оболочке, что означает, что $ PATH может отличаться от того, который вы используете при запуске сценария из командной строки.
Лучше всегда использовать полные пути в скриптах, особенно если вы планируете их планировать через / cron и т. Д.
Я также рекомендовал бы использовать полные пути ко всем файлам, чтобы точно избежать проблем, которые вы видите.
Чтобы предотвратить состояние гонки и другие проблемы с безопасностью, вы также
mktemp
должны убедиться, что прочитанный файл не изменен ничем, кроме вашего сценария.Поэтому я бы изменил сценарий на что-то вроде:
источник
cron
запускает запланированные задания каждого пользователя от имени этого пользователя. Этого должно быть достаточно, чтобы мы выяснили, что он запускает ваши сценарии относительно вашего домашнего каталога.Если вам нужно запустить его из другого места, просто используйте его
cd
в своем скрипте, чтобы перейти в это место.ssmtp
вероятно, отсутствует вcron
PATH по умолчанию (он установлен очень узким для большинства платформ). Вы можете либо указать полный путь кssmtp
вашему скрипту, либо явно указать PATH в а) вашем файле crontab, который будет доступен для всех ваших скриптов, или б) в каждом скрипте.источник
Посмотрите в этой ветке, как вы можете легко узнать окружение cron, это гораздо меньше, чем вы привыкли в интерактивной оболочке. Лучше всего предположить, что ничего не было установлено, и явно установить это самостоятельно.
источник
Рабочим каталогом по умолчанию для
cron
выполнения задания обычно является домашний каталог/home/your-user-name
.Принятие @Kusalananda отличный комментарий.
источник
/home
далеко от универсального./home
./Users
и использует исторические Unices/usr
, и даже в Linux домашний каталог системного пользователя может быть где-то в/var
другом месте или где- то еще.Некоторые люди намекают или связывают это, но лучший способ узнать это, так как я не могу найти это в документации человека для моего дистрибутива, это просто добавить это в cron
В моем случае Ubuntu по умолчанию использует только то,
/usr/bin:/bin
что вызвало несколько проблем.источник