在脚本中放置错误日志与在 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
我想弄清楚为什么脚本使用 ./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