我正在尝试使用网络摄像头拍摄一张照片,我需要记录输出以检查错误,但 cron 无法做到这一点。我可以从终端执行此操作,但 cron 运行它不起作用。
脚本如下:
/bin/bash #!/bin/bash 脚本 -ac“fswebcam -c /home/webcam/webcam.conf”/data/webcam/logscript.txt
计划任务:
@reboot mv /home/webcam/tmp/* /home/webcam/tmp_lost/ * * * * * sh /data/webcam/script.sh > /data/webcam/log.txt 2>&1
终端输出:
[webcam@raspberry-pi 网络摄像头]$ sh /data/webcam/script.sh 脚本已启动,文件为 /data/webcam/logscript.txt --- 打开 V4L2:/dev/video0... /dev/video0 已打开。 将亮度设置为 0 (50%)。 将对比度设置为 19 (20%)。 --- 捕获帧... 跳过 50 帧... 等待帧超时! 正在捕获 1 帧... 等待帧超时! 0.00 秒内捕获帧。 未捕获任何帧。 脚本完成,文件为 /data/webcam/logscript.txt
从终端运行时,logscript.txt(由脚本命令生成):
[webcam@raspberry-pi 网络摄像头]$ cat logscript.txt 脚本于 2013 年 10 月 21 日 21.10.52 开始运行 --- 打开 V4L2:/dev/video0... /dev/video0 已打开。 将亮度设置为 0 (50%)。 将对比度设置为 19 (20%)。 --- 捕获帧... 跳过 50 帧... 正在捕获 1 帧... gd-jpeg:JPEG 库报告不可恢复的错误:不是 JPEG 文件:以 0xba 0x28 开头 3.91 秒内捕获 51 帧。(13 fps) --- 处理捕获的图像... 水平翻转图像。 垂直翻转图像。 将横幅置于底部。 将横幅背景颜色设置为#FF000000。 将横幅线颜色设置为#FF000000。 将横幅文本颜色设置为#FFFF00。 将字体设置为 luxisr:12。 设置时间戳“%d.%m.%Y %H:%M”。 将 JPEG 图像写入‘/home/webcam/tmp.jpg’。 脚本完成于 2013 年 10 月 21 日 21.10.57
通过 cron 运行。Cron 输出 -> log.txt
[webcam@raspberry-pi 网络摄像头]$ cat log.txt 脚本已启动,文件为 /data/webcam/logscript.txt 脚本完成,文件为 /data/webcam/logscript.txt --- 打开 V4L2:/dev/video0... /dev/video0 已打开。 将亮度设置为 0 (50%)。 将对比度设置为 19 (20%)。 --- 捕获帧... 跳过 50 帧... 正在捕获 1 帧... gd-jpeg:JPEG 库报告不可恢复的错误:不是 JPEG 文件:以 0x8e 0x80 开头 3.38 秒内捕获 51 帧。(15 fps) --- 处理捕获的图像... 水平翻转图像。 垂直翻转图像。 将横幅置于底部。 将横幅背景颜色设置为#FF000000。 将横幅线颜色设置为#FF000000。 将横幅文本颜色设置为#FFFF00。 将字体设置为 luxisr:12。 设置时间戳“%d.%m.%Y %H:%M”。 将 JPEG 图像写入‘/home/webcam/tmp.jpg’。 脚本已启动,文件为 /data/webcam/logscript.txt
cron 之后 logscript.txt 文件为空,这就是问题所在。如您所见:从 cron 运行时,脚本命令在任何输出发生之前启动并完成。在终端中一切正常。有人知道为什么会发生这种情况吗?
答案1
当被调用时sh /data/webcam/script.sh > /data/webcam/log.txt 2>&1
,sh 将解释/data/webcam/script.sh
为一个命令文件,并将其他所有内容解释为它的参数——可能还包括重定向运算符。
强制sh
解释'/data/webcam/script.sh > /data/webcam/log.txt 2>&1'
为命令:
sh -c '/data/webcam/script.sh > /data/webcam/log.txt 2>&1'