Що таке "робочий каталог", коли cron виконує завдання?


170

У мене є сценарій, який працює, коли я запускаю його з командного рядка, але коли я планую його, cronя отримую помилки, які він не може знайти файли чи команди. Моє запитання двояке:

  1. Коли я планую роботу з cron за допомогою crontab -e, чи використовує він мій ідентифікатор користувача як основу для його дозволів? Або він використовує ідентифікатор користувача cron якогось типу та пов'язані з ним дозволи?

  2. Коли запускається робота 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, але я можу бути своїм користувачем. Що мені не вистачає, щоб це нормально працювало?

Відповіді:


158

Додайте, cd /home/xxxx/Documents/Scripts/якщо ви хочете, щоб ваша робота працювала в цьому каталозі. Немає жодних причин, чому cron змінився б саме в цьому конкретному каталозі. Cron запускає ваші команди у вашому домашньому каталозі.

Що стосується ssmtp, це може бути не за замовчуванням PATH. Шлях за замовчуванням Cron залежить від впровадження, тому перевірте свою сторінку користувача, але, швидше за ssmtpвсе, /usr/sbinце не така за замовчуванням PATH, а лише корінь.

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
15 7 * * * cd /home/xxxx/Documents/Scripts && ./email_ip_script.sh

@Giles - Дякую, чи cronбуде вона власною PATHчи я можу перевірити свого користувача PATH? Я встановив ssmtp, щоб він мав власний userта wheelдозвіл, думаючи, що це дозволить будь-кому користуватися ним (включаючи cron). Якщо це допоможе Ім на CENTOS 6.2
ProfessionalAmateur

3
@ProfessionalAmateur Ваша проблема полягає не в тому, що вам заборонено користуватися ssmtp, а в тому, що ваша робота в Cron не знаходить жодного виконуваного файлу, ssmtpоскільки він не є у вашому PATH. Немає такого поняття, як "ваш користувач PATH"; це налаштування для кожного процесу, а не налаштування для кожного користувача. Ви можете встановити шлях для всіх своїх завдань у галузі cron, поставивши PATH=…рядок у своєму crontab.
Жиль

Мені довелося додати MAILTO='XXXX@gmail.com ', аби він працював разом із налаштуваннями PATH. Wierd, але це працювало на мене.
мак

Для ssmtp можна використовувати; ´which ssmtp´ ...
Фредрік Гаус


20

Якщо ваш cronjob - це сценарій bash, наступне розташування CD буде розміщене на вашому сценарії (якщо припустимо, що ви використовуєте абсолютний шлях у своєму визначенні cron):

cd "$(dirname "$0")";

14

Щоб відповісти на запитання 1: якщо ви запускаєте crontab -eяк власного користувача, завдання будуть заплановані в кроні вкладки цього користувача і, таким чином, працюватимуть з дозволами цього користувача.

Але вам потрібно врахувати, що завдання виконуватимуться в неінтерактивній оболонці, що означає, що $ PATH може відрізнятися від тієї, яку ви маєте при запуску сценарію з командного рядка.

Найкраще завжди використовувати всі сценарії в сценаріях, особливо якщо ви плануєте їх планувати через at / cron тощо.

Я також рекомендую використовувати повний шлях до всіх файлів, щоб точно не виникати проблем.

Щоб запобігти умовам перегонів та іншим проблемам безпеки, ви також повинні використовувати, mktempщоб переконатися, що прочитаний файл не змінюється за межами сценарію.

Тому я змінив би сценарій на щось на кшталт:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
mail_msg=`/bin/mktemp`
/bin/sed "s/IPADDR/$vIP_ADDR/g" /home/xxxx/Documents/Scripts/template.txt > $mailmsg
/path/to/ssmtp XXXXX@gmail.com < $mailmsg
/bin/rm $mailmsg

7

cronвиконує заплановані завдання кожного користувача як цей користувач. Цього має бути достатньо для того, щоб ми з’ясували, що він запускає ваші сценарії відносно домашнього каталогу.

Якщо вам потрібно запустити його з іншого місця, просто використовуйте cdу своєму сценарії перехід до цього місця.

ssmtpнапевно, не за cronзамовчуванням PATH (вона встановлена ​​дуже вузькою за дизайном на більшості платформ). Ви можете або вказати повний шлях до ssmtpсвого сценарію, або ви можете явно встановити PATH у a) своєму файлі crontab, який буде доступний для всіх ваших сценаріїв, або b) у кожному сценарії.


3

Перевірте цю тему, як ви можете легко дізнатися середовище cron, це набагато менше, ніж ви звикли в інтерактивній оболонці. Найкраще - припустити, що нічого не встановлено, і явно встановити це самостійно.


1

Типовим робочим каталогом для cronвиконання завдання є домашній каталог, як правило /home/your-user-name.

Прийняття @Kusalananda відмінний коментар.


1
Ні. Це залежить від того, де система зберігає домашні каталоги. /homeдалеко не універсальний.
Кусалаланда

1
@Kusalananda Стандарт LSB говорить /home.
пітер

1
@peterh Добре, що macOS використовує /Usersі історичні Unices /usr, і навіть на Linux домашній каталог користувачів системи може бути десь під /varабо деінде.
Kusalananda

1
@Kusalananda Це правильно.
пітер

Дякую, ти єдина людина, яка насправді відповіла на це запитання :)
OwN

0

Деякі люди натякали на це чи зв’язували це, але найкращий спосіб це дізнатися, оскільки я не можу знайти його в документах man для мого дистрибутива - просто додати це до крона

* * * * * echo $PATH > /tmp/lolcronjobs

У моєму випадку ubuntu за замовчуванням використовує лише те, /usr/bin:/binщо спричинило кілька проблем.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.