2016-11-17 2 views
2

Я просто изучаю Linux, поэтому, пожалуйста, несите меня, как, возможно, упустили что-то очевидное здесь. В настоящее время я пытаюсь настроить задание cron для запуска пользовательского сценария оболочки. Этот сценарий отлично работает с терминалом, но не через cron. Ниже приведены подробности. Я буду благодарен за понимание у опытных пользователей.Сценарий оболочки, не запущенный через crontab на Linux Mint

System Info

RELEASE=17.3 
CODENAME=rosa 
EDITION="Cinnamon 64-bit" 
DESCRIPTION="Linux Mint 17.3 Rosa" 
DESKTOP=Gnome 
TOOLKIT=GTK 
NEW_FEATURES_URL=http://www.linuxmint.com/rel_rosa_cinnamon_whatsnew.php 
RELEASE_NOTES_URL=http://www.linuxmint.com/rel_rosa_cinnamon.php 
USER_GUIDE_URL=help:linuxmint 
GRUB_TITLE=Linux Mint 17.3 Cinnamon 64-bit 

сценария Пользовательские оболочки

Адрес: /usr/local/bin/make_ls_files.sh

Содержание:

#!/bin/bash 

# test script to echo ls stout to files 
# (learning cron jobs) 

# tilde path not working in cron, trying full path 
# ls > ~/ls_file_$(date +%F_%H-%M-%S).log 
ls > /home/zion/ls_file_$(date +%F_%H-%M-%S).log 

сумы t работает отлично от терминала (от любого cwd), он выводит файл /home/zion/ls_file_2016-11-17_17-38-37.log с выходом ls.

Теперь у меня есть настроить хрон работу через crontab -e:

# create text files every minute: 
PATH=/usr:/usr/bin:/usr/local/bin 
* * * * * make_ls_files.sh >> /usr/local/bin/make_ls_files_log.log 2>&1 

я вижу в системном журнале, что это на самом деле работает, но не выход или войти запись не создается. Syslog показывает это:

... 
Nov 17 17:42:01 zion-VirtualBox CRON[4845]: (zion) CMD (make_ls_files.sh >> /usr/local/bin/make_ls_files_log.log 2>&1) 
Nov 17 17:42:01 zion-VirtualBox CRON[4844]: (CRON) info (No MTA installed, discarding output) 
Nov 17 17:43:02 zion-VirtualBox CRON[4850]: (zion) CMD (make_ls_files.sh >> /usr/local/bin/make_ls_files_log.log 2>&1) 
Nov 17 17:43:02 zion-VirtualBox CRON[4849]: (CRON) info (No MTA installed, discarding output) 

Любые идеи о том, почему он не работает и как отлаживать?

EDIT 01:

Я изменил хрон на:

* * * * * make_ls_files.sh 2>>$HOME/crontab.log 

Теперь я получаю где-то файл журнала создается в /home/zion/crontab.log, содержащий:

/usr/local/bin/make_ls_files.sh: line 6: date: command not found 
/usr/local/bin/make_ls_files.sh: line 6: ls: command not found 

Почему ls и date не распознаются?

EDIT 02

Спасибо всем, я узнал кое-что здесь. Как Руслан pointend из меня было 2 вопроса:

  • недостаточное разрешение для размещения файла журнала
  • недостаточен путь определений

Все работает сейчас, окончательный cronjob ниже:

# create text files every minute: 
PATH=/bin:/usr:/usr/bin:/usr/local/bin 
# * * * * * make_ls_files.sh >> /usr/local/bin/make_ls_files_log.log 2>&1 
* * * * * make_ls_files.sh 2 >> $HOME/crontab.log 
+1

вы должны использовать полный путь к 'make_ls_files.sh' в crontab' * * * * * /usr/local/bin/make_ls_files.sh >> /usr/local/bin/make_ls_files_log.log 2> & 1' – bansi

+0

@ bansi, это не обязательно, если '/ usr/local/bin /' находится в '$ PATH' –

+0

@RuslanOsmanov, путь по умолчанию Cron зависит от реализации и не может быть надежным через дистрибутивы. Так что всегда лучше быть на более безопасной стороне. – bansi

ответ

2

Скорее всего, у вас недостаточно прав для записи в каталог /usr/local/bin. Это легко проверить, запустив touch /usr/local/bin/myfile в терминале.

Вы должны перенаправить ошибки в файл журнала, чтобы узнать точную причину.

Убедитесь, что все исполняемые файлы в скрипте доступны через PATH, то есть каталоги в список PATH.

Пример

PATH=$PATH:/bin:/usr:/usr/bin:/usr/local/bin 
* * * * * make_ls_files.sh >> /tmp/make_ls_files_log.log 2>>$HOME/crontab.log 

Обратите внимание, что вам нужно, по крайней мере запись (w) и выполнение (х) разрешений для файлов журнала каталогов!

Также обратите внимание, что ваша реализация Cron должна поддерживать переопределение PATH переменной окружения через crontab. В противном случае вы должны указать абсолютные пути для всех исполняемых файлов. Вы также можете настроить PATH в сценарии оболочки следующим

export PATH=$PATH:/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin 

(перед использованием команд).

P.S .: использовать команду which в терминале для обнаружения местоположения команды, например. which ls.

+0

Вы правы, я полагаю, что у меня не было права писать в '/ usr/local/bin', изменил путь к файлу журнала и теперь получил вывод. См. Мое редактирование выше. –

+0

@ B-and-P, включают '/ bin' в' PATH'. Используйте команду 'which' в терминале, чтобы проверить, где она расположена, например. 'which ls' –

+0

Aha! отлично, спасибо! Таким образом, не являются ли пути, определенные в crontab, добавленными к системным путям, но превышают? –

Смежные вопросы