2016-02-17 1 views
1

Я пытаюсь понять, почему сценарий работает с использованием ./runmusic, но не запускается из cronjob. Где и почему было бы лучше всего разместить отчет об ошибках?есть ли разница в выходе ошибки при размещении регистрации ошибок в скрипте и в самой cronjob?

мой сценарий

[email protected] ~/Music $ cat runmusic 
#!/bin/bash  
exec >>omx_log_from_runmusic 2>&1 
echo $(date) 
DISPLAY=:0 

var=$(\ls songs/|shuf -n 1) 
#omxplayer -o local /home/pi/Music/Bloodletting.mp3 
omxplayer -o local "/home/pi/Music/songs/$var" 

$ кронтаб -l

* * * * * bash /home/pi/Music/runmusic > /tmp/setvals 

Я сейчас не получаю сообщения об ошибках от любой из этих файлов, хотя я получаю ожидается вывод текста из в-скрипта Ведение журнала. например «Have nice day :)» в качестве закрытия omxplayer

+1

Сценарий перенаправляет 'stderr' в' stdout', который перенаправляется на 'omx_log_from_runmusic'. В этом файле вы найдете журнал ошибок. Перенаправление в cron будет пустым, потому что сценарий уже перенаправил файлы 'stderr' и' stdout' в файл. Перенаправление в cron ограничено перенаправлением 'stdout' и' stdin' в файл вместе или по отдельности. Сценарий имеет гораздо больший контроль, потому что он может перенаправляться на несколько целей по мере необходимости, например, один журнал для БД, другой журнал для не-БД и т. Д. – alvits

+0

Запуск интерактивных программ от 'cron' просто сумасшедший. – tripleee

+0

@triplee Я не думал, что это интерактивная программа .... она просто отображает уведомление. Он не требует ввода пользователя. Можете ли вы объяснить, почему запустить его, как будто это плохая идея? – Rilcon42

ответ

1

Как уже упоминалось в комментариях, вы уже перенаправляете весь вывод с помощью exec, так что ничего не нужно для cron для входа в систему. Предполагая, что разрешения являются разумными, вы должны увидеть свой журнал в omx_log_from_runmusic. Вы можете указать явный путь к файлу журнала и убедиться, что у пользователя, работающего с cron, есть разрешение на его запись.

Нет необходимости создавать подоболочку для запуска date, а затем эхо результата, просто запустите команду. Он будет отправлен в журнал со всем другим выходом.

Вы обычно set your script to executable (chmod +x mymusic), а затем вызвать его непосредственно из cron, в отличие от вызова bash и передавая имя сценария в качестве аргумента. Также, связанный с cron, вы вызываете это каждую минуту; все твои песни меньше минуты? Если нет, вы можете проверить, чтобы убедиться, что omxplayer еще не запущен, прежде чем запускать новый.

И you should not be parsing the output from ls, как вы столкнетесь с проблемами, как только вы столкнетесь с файла с пробелами в имени (см также bash FAQ 50.) Вы можете использовать glob, чтобы получить список файлов в массив, а затем использовать RANDOM до grab an element из массива.

#!/bin/bash 
exec >> /full/path/to/omx_log_from_runmusic 2>&1 
date 
DISPLAY=:0 

if pgrep omxplayer 
then 
    exit 
else 
    files=(/home/pi/Music/songs/*) 
    n=${#files[@]} 
    omxplayer -o local "${files[RANDOM % n]}" 
fi 
+1

Если бы я мог дать вам несколько upvotes для этого, я бы ... это было значительно более подробно, тогда я ожидал – Rilcon42

+0

Я думал, что положить строку omxplayer в кавычки устранит проблему с пробелами? Не работает ли это? – Rilcon42

+0

Нет, потому что вывод 'ls' в вашем скрипте был передан' shuf' в виде строки, и он не распознает разницу между белым пространством имени файла и синтаксическим пробелом. – miken32

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