cron та "команда не знайдена"


2

Я встановлюю завдання cron для запуску виконуваного скрипта bash, який містить команду pypdfocr. Кожен раз, коли я вручну виконую сценарій, все працює як слід, якщо замість цього я використовую cron з цим графіком:

* 6 * * * cd /path/to/ && ./executable

Я отримую цю помилку:

pypdfocr: command not found

Враховуючи це, у сценарії bash я намагався надати повний шлях до pypdfocr, тобто:

/anaconda/bin/pypdfocr

Але тепер у мене є:

/bin/sh: pdfimages: command not found
/bin/sh: gs: command not found

Будь-яка ідея, як я можу це виправити?


2
додайте повний шлях до pdfimagesта gsу свій сценарій.
fd0

Я не називаю pdfimages та gs безпосередньо у своєму скрипті, вони обидва використовуються pypdfocr, отже, я не можу додати повний шлях до свого сценарію.
SergeGardien

Відповіді:


4

Під час cronзапуску події вона використовує середовище оболонки за замовчуванням запущеного UID. Однак не застосовується жодна настройка "профілю", тобто ваш .bash_profileресурс не отримується, і жодні налаштування PATH не підбираються. Крім того, я не вірю, що загальні профілі теж не підібрані. Таким чином , ви , ймовірно, немає PATHабо LD_LIBRARY_PATHпараметрів середовища , доступних для процесу , який ви намагаєтеся запустити , і саме тому pdfimagesі gsне підхопив за замовчуванням.

Раніше я вирішував це один із двох способів:

  1. Безпосередньо посилайтеся на повний шлях потрібного мені файлу.
  2. Створіть сценарій оболонки для обгортки.

Я, як правило, віддаю перевагу другому, оскільки він не тільки дозволяє мені створити середовище для роботи, яку потрібно запускати, але це також дозволяє досить легко додавати ситуації налагодження легко. Наприклад, якщо робота не працює належним чином, я можу просто відредагувати скрипт оболонки і ввести STDOUTперенаправлення на файл налагодження.

Отже, коротше кажучи, я мав би записатись у крон

* 6 * * * cd /path/to/ && ./executable.sh

.. який міняв би шлях, але executable.shзробив би все export PATH, export LD_LIBRARY_PATHі т.д., щоб налаштувати свою роботу.

Ваш зразок executable.shможе бути таким же простим:

#!/bin/bash

# if you want to just pick up your profile, you can '.' source it
. ~/.bash_profile

export PATH=/where/i/find/gs
export LD_LIBRARY_PATH=/if/i/need/libs

(./executable 2&>1) >executable.out

executable.outПеренаправлення файл не є необхідним , так як без неї все STDOUTйде до cron.out, але він робить це трохи чистіше , щоб зробити це таким чином. Також 2>&1дурниці з дужками переконайтесь, що обидва STDERRі STDOUTвнести їх у вихідний файл; це допомагає налагодити, чому робота не виконувалася.


1
cronстворює власне середовище. Зокрема, встановлено значення SHELL і встановлено значення /bin/shPATH /usr/bin:/bin. Навколишнє середовище може бути налаштоване у користувачеві crontab. Детальніше читайте в man 5 crontab.
fd0

@ fd0: встановлення змінних середовища в crontab не є універсальним для всіх реалізацій; Я не впевнений, чи це робить darwin / osx / macos? Незалежно від того, ці параметри застосовуватимуться до всіх записів кронів, які можуть бути, а можуть і не бажати. Як такий, я, мабуть, все-таки пропоную спробувати запустити скрипт у будь-якому випадку, оскільки у вас є принаймні індивідуальний контроль роботи.
bjb

0

Врешті-решт я дотримувався рішення, запропонованого в розділі Як використовувати макпорти Python для роботи з cron? .

Я перевірив своє середовище PATH, запустивши envз терміналу, потім експортував його у свій виконуваний файл.

виконуваний файл:

#!/bin/bash
export PATH=/Library/Frameworks/Mono.framework/Versions/Current/bin/:/opt/local/bin:/opt/local/sbin://anaconda/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/opt/local/bin:/opt/local/sbin:/Library/Frameworks/Python.framework/Versions/2.6/bin:/sw/bin:/sw/sbin:/usr/bin:/bin:/usr/local/bin:/opt/X11/bin:/Users/USER/Library/Android/sdk/platform-tools/:/Users/USER/Library/Android/sdk/tools/:/usr/sbin/:/Users/USER/Tools/cpdf/OSX-Intel/
# ...
# REST OF SCRIPT
# ...

Після цього я змінив свій cronfile таким чином:

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