在脚本中放置错误日志与在 cronjob 本身中放置错误日志时,错误输出是否有区别?

is there a difference in error output when placing error logging in the script vs in the cronjob itself?

我想弄清楚为什么脚本使用 ./runmusic 运行但不是从 cronjob 启动。哪里以及为什么是放置错误报告的最佳位置?

我的脚本

pi@raspberrypi ~/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"

$crontab -l

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

我现在没有从这些文件中的任何一个收到错误报告,尽管我从脚本内日志记录中得到了预期的文本输出。例如 "Have a nice day :)" 作为 omxplayer

的关闭

如评论中所述,您已经使用 exec 重定向了所有输出,因此 cron 没有任何内容可以记录。假设权限合理,您应该会在 omx_log_from_runmusic 中看到您的登录信息。您可能需要指定日志文件的显式路径并确保用户 运行ning cron 有权写入它。

不需要为 运行 date 创建子 shell 然后回显结果,只需 运行 命令。它将与所有其他输出一起发送到日志。

您通常会 set your script to executable (chmod +x mymusic) 然后直接从 cron 调用它,而不是调用 bash 并将脚本名称作为参数传递。也与 cron 相关,您每分钟都在调用它;你所有的歌曲都不到一分钟吗?如果不是,您可能需要检查以确保 omxplayer 在开始新的之前还没有 运行ning。

并且,you should not be parsing the output from ls as you will run into problems as soon as you come across a file with whitespace in the name (see also bash FAQ 50.) You can use a glob to get the file list into an array, and then use RANDOM to 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