виконання скрипту sh із крона


12

У мене є скрипт test.sh

#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh

коли я виконую файл як корінь з командного рядка, він працює.

sh /home/v/test.sh 

коли я встановив його на crontab -e (є кореневим cron), не працює

 * * * * * sh /home/v/test.sh

Що я роблю неправильно? Дякую


"не працює" не працює. Побачити? Ви не знаєте, що я маю на увазі, і якби ми не знали, що ви маєте на увазі. Я маю на увазі (так) те, що не працює? Може бути про що завгодно. Можливо, tmow здогадка правильна, але це лише здогадка (і досить гарна, я думаю, але все ж).
Юрген А. Ерхард

Так, якщо ви можете бути більш конкретними щодо того, які результати ви бачите, ми зможемо краще визначити, у чому проблема. Тобто, що ви маєте на увазі "не працює" (:
gabe.

Я не бачу жодного журналу в syslog, і сценарії роблять деякі вставки в db, що не відбувається, і вони трапляються, якщо я запускаю сценарій вручну.
Elzo Valugi

Відповіді:


15

За словами чоловіка:

Демон cron запускає підзаголовок з вашого каталогу HOME. Якщо ви плануєте запускати команду, коли ви не ввійшли в систему і хочете запускати команди у вашому .profile-файлі, команда повинна чітко читати ваш .profile-файл.

Демон cron забезпечує середовище за замовчуванням для кожної оболонки, визначаючи HOME, LOGNAME, SHELL (= / usr / bin / sh)
та PATH (= / usr / bin).

Отже, демон cron не знає, де знаходиться php, і вам слід вручну вказати повний шлях до php (наприклад, я не знаю вашого справжнього шляху до PHP):

#!/bin/sh
/usr/local/bin/php /home/v/file.php
sh /root/x/some.sh

Інший спосіб - наприклад, джерело / etc / profile (або ваш .profile / .bashrc)

* * * * * . /home/v/.bashrc ; sh /home/v/test.sh

Це корисно, якщо ваш .bashrc встановив потрібні вам змінні середовища (тобто PATH)

EDIT

Цікаве прочитання: « Новачок: Вступ до крона », не варто недооцінювати статтю з назви (Це є читання для всіх), адже вона добре написана в повному обсязі і чудово відповідає на ваше запитання:

...
PATH містить каталоги, які будуть знаходитись у шляху пошуку для cron, наприклад, якщо у вас є програма 'foo' у каталозі / usr / cog / bin, можливо, варто додати / usr / cog / bin до шлях, тому що це зупинить вам необхідність використовувати повний шлях до "foo" кожного разу, коли ви захочете його зателефонувати.
...


Bad $ PATH - найпоширеніша причина сценаріїв, які працюють вручну, але не з крона.
Патрік

@Patrick Звичайно, це проблема, якщо cron не знає, де є php, в іншому випадку Elron crontab працюватиме без жодних проблем, це ОБОВ'ЯЗКОВО бути проблемою PATH.
tmow

Дякую за вашу відповідь. Це працювало для мене дуже легко !!! .. Дякую велике @tmow.
Vignesh Prajapati

5

Існує чотири загальні причини для команд, що працюють при введенні в термінал, але не з cron, у порядку спільності:

  1. Cron забезпечує обмежене середовище, наприклад, мінімум $PATHта інші очікувані змінні відсутні.
  2. Cron викликає / bin / sh за замовчуванням, тоді як ви можете використовувати іншу оболонку інтерактивно.
  3. Cron спеціально обробляє символ% (він перетворюється на новий рядок у команді).
  4. Cron не забезпечує термінальне чи графічне середовище.

Якщо ваше завдання дає будь-який вихід, включаючи повідомлення про помилки, cron надсилає вам електронний лист із усім результатом. Переконайтесь, що ви прочитали місцевий лист, який ви отримали, або переслали його на адресу, яку ви прочитали. Щоб переслати пошту з локального облікового запису на іншу адресу, введіть іншу адресу ~/.forward. Якщо завдання Cron виконується як користувач системи ( root,, webmaster...), переконайтеся, що пошта користувача перенаправлена ​​до вас (та будь-якого іншого адміністратора); з більшості налаштувань пошти, розмістіть рядки, як root: elzoв /etc/aliases.


2

Демон cron зазвичай виконує вашу команду в оболонці, де змінна середовища PATH обмежена деяким системним замовчуванням, наприклад / usr / bin: / bin.

Ймовірно, ваша phpкоманда недоступна в / usr / bin або / bin, і тому сценарій виходить з ладу, коли виконується через cron і працює успішно, коли ні.

Зазвичай Cron повідомляє про помилки або повідомлення про роботу електронною поштою кореневому користувачеві (тобто, коли команда повертає статус виходу! = 0 або видає результат для stdout / stderr) після завершення завдання.

Залежно від вашої системи вам потрібно налаштувати локальну доставку пошти, щоб отримати ці повідомлення.

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