我创建了一个bash脚本,通过声卡的/ mic端口记录声音输入,当通过静音检测到声音时,它会记录到临时文件,然后在新文件中标记日期并添加它到数据库。
我需要实现的是使脚本在启动时启动,不断反复运行脚本,并在无法自行重启的情况下重启的好方法。下面是我目前从各种来源汇总的代码,到目前为止它运作良好。但我需要它能够在没有任何用户交互的情况下全天候运行。
这是我创建的第一个真正的bash脚本,所以希望对我使用的方法有更有经验的输入,如果它是错误的或正确的。
我尝试通过start-stop-daemon进行守护进程,但最终得到了多个正在运行的脚本和sox命令。目前我让它在rc.local中启动时执行,我个人认为这是通过在脚本底部再次添加命令来重启脚本的正确方法...但我不是&# 39;不知道其他任何方式。
非常感谢任何形式的帮助。
#!/bin/bash
#Remove temp file just incase
rm -rf temp.mp3
#Listen for audio and record
sox -d /home/user/temp.mp3 silence 1 5 8% 1 0:00:01 8%
#Check if temp.mp3 is greater than 800 bytes so we don't get blank recordings added to the
#database, if the file is below 800 bytes remove the file and restart.
for i in /home/user/temp.mp3 ; do
b=`stat -c %s "$i"`
if [ $b -ge 800 ] ; then
NAME=`date +%Y-%m-%d_%H-%M-%S`
TIME=`date +%H:%M:%S`
FILENAME=/var/www/Recordings/$NAME.mp3
FILEWWW=Recordings/$NAME.mp3
mv /home/user/temp.mp3 $FILENAME
rm -rf temp.mp3
mysql --host=localhost --user=root --password=pass database << EOF
insert into recordings (id,time,filename,active,status) values('NULL','$TIME','$FILEWWW','1','1');
EOF
else
rm -rf /home/user/temp.mp3
echo 'No sound detected, Restarting...'
fi
done
/home/user/vox
exit 0
答案 0 :(得分:1)
要重新启动脚本,您可以通过crontab Crontab Howto
调用它答案 1 :(得分:1)
您是否尝试过Daemonizing您的脚本? 不同的操作系统有自己的文档,说明如何守护脚本并将其添加到系统启动。 看看你的问题,我相信这就是你必须要做的。但要小心使用系统资源并包括适当的休眠时间,以尽量减少系统资源的使用。
否则还建议添加一个cron作业,因为它不会一直在后台运行。
答案 2 :(得分:0)
@Gurubaran这是新代码,它用来分叉一个新进程,但现在我通过一个调用自身的函数使用循环,所以它不会分叉,虽然sox命令是一个单独的分支,它是必要的,我确保我直接杀死袜子。这一切看起来都好吗?它看起来效果很好。当我收到用于测试的电缆而不是我的手机时,我需要正确测试它。该脚本也通过start-stop-daemon
进行守护#!/bin/bash
pkill sox
function vox() {
rm -rf /home/user/temp.mp3
sox -d /home/user/temp.mp3 silence 1 5 4% 1 0:00:01 4%
wait
for i in /home/user/temp.mp3 ; do
b=`stat -c %s "$i"`
if [ $b -ge 800 ] ; then
NAME=`date +%Y-%m-%d_%H-%M-%S`
TIME=`date +%H:%M:%S`
FILENAME=/var/www/Recordings/$NAME.mp3
FILEWWW=Recordings/$NAME.mp3
mv /home/user/temp.mp3 $FILENAME
rm -rf /home/user/temp.mp3
mysql --host=localhost --user=root --password=pass database << EOF
insert into recordings (id,time,filename,active,status) values('NULL','$TIME','$FILEWWW','1','1');
EOF
else
rm -rf /home/user/temp.mp3
fi
done
vox
}
vox