AT作业执行的Bash脚本创建了额外的文件

问题描述 投票:0回答:1

我正在尝试使用RTL-SDR设置无头RPi 3,以捕获来自NOAA气象卫星的图像。我正在研究从此处获取的代码:https://www.instructables.com/id/Raspberry-Pi-NOAA-Weather-Satellite-Receiver/

at任务执行receive_and_process_satellite.sh。此脚本开始收听rtl_fm,在特定的sox期间,该脚本将timeout的音频通过管道传输到wav文件。然后它将音频处理成卫星图像。

问题在于,它不会等到timeout之后才创建已处理的文件。相反,它创建了多余的文件,从而忽略了变量$3中的文件名。

在任务处:

pi@rpi-rtl-sdr:~/weather/images $ atq
37      Sun Apr 12 12:44:00 2020 a pi
pi@rpi-rtl-sdr:~/weather/images $ at -c 37
#!/bin/sh
# atrun uid=1000 gid=1000
# mail pi 0

<--snipped out bunch of code generated by at-->

cd /home/pi/weather/predict || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
sudo /home/pi/weather/predict/receive_and_process_satellite.sh "NOAA 18" 137.9125 /home/pi/weather/predict/NOAA1820200412-124416 /home/pi/weather/predict/weather.tle 1586688256 936

因此,所有文件应以NOAA1820200412-124416开头。

receive_and_process_satellite.sh

#!/bin/bash

# $1 = Satellite Name
# $2 = Frequency
# $3 = FileName base
# $4 = TLE File
# $5 = EPOC start time
# $6 = Time to capture

# -p -4 = $ PPM after running rtl_test -p
# -T = bias T

sudo /usr/bin/timeout ${6} /usr/bin/rtl_fm -f ${2}M -s 60k -g 25 -p -4 -E deemp -F 9 -T - | /usr/bin/sox -t raw -e signed-integer -b 16 -r 60k -c 1 - ${3}.wav rate 11025

PassStart=`expr ${5} + 90`

if [ -e ${3}.wav ]
 then
    /usr/local/bin/wxmap -T "${1}" -H ${4} -p 0 -l 0 -o ${PassStart} ${3}-map.png

    /usr/local/bin/wxtoimg -m ${3}-map.png -e ZA ${3}.wav ${3}.png

fi

运行时创建的文件

pi@rpi-rtl-sdr:~/weather/images $ ls -lh
total 25M
-rw-r--r-- 1 root root 986K Apr 12 13:00 NOAA1820200412-124416-map.png
-rw-r--r-- 1 root root 1.2M Apr 12 13:00 NOAA1820200412-124416.png
-rw-r--r-- 1 root root  20M Apr 12 12:59 NOAA1820200412-124416.wav
-rw-r--r-- 1 root root 986K Apr 12 12:44 NOAA1820200412-124401-map.png
-rw-r--r-- 1 root root 1.9K Apr 12 12:44 NOAA1820200412-124401.png
-rw-r--r-- 1 root root   44 Apr 12 12:44 NOAA1820200412-124401.wav

请注意,at它是如何在12:44:00开始创建非常小的44字节wav文件的脚本,甚至更改了文件名,与$3不同!文件名是由at作业传递给脚本的,所以我不知道这种情况如何发生。据我所知,receive_and_process_satellite.sh不会更改文件名。

我已经尝试过的事情:

  1. 手动运行脚本sudo /home/pi/weather/predict/receive_and_process_satellite.sh "NOAA 18" 137.9125 /home/pi/weather/predict/NOAA1820200412-124416 /home/pi/weather/predict/weather.tle 1586688256 10。仅在at运行作业时,才会创建多余的文件。

  2. 更改为receive_and_process_satellite.sh

    2.1从sudo timeoutsudo /usr/bin/timeout

    2.2将所有变量放在大括号{}之间。在此之前,这是一种混合,所以我认为这可能是在弄乱变量。

  3. sudo添加到at作业。以前,这个44字节的小wav文件和它试图从中解码的图像是root拥有的,其余的则是pi拥有的。 sudo之后,所有内容均由root拥有。

linux bash raspberry-pi at-command sox
1个回答
0
投票

我找到了解决方案:在sudo crontab -e中添加了用于添加at作业的cronjob。因此,当我执行atq时,看不到这些作业。在测试期间的某个地方,我手动创建了at作业,这意味着它们现在在那里存在过两次。当我执行sudo atq时,才获得完整图片。

所以我删除了所有at作业,并在crontab -e中而不是sudo crontab -e中添加了cronjob。

尽管这最终改变了文件名,但对我来说仍然是一个谜。

© www.soinside.com 2019 - 2024. All rights reserved.