在启动Linux时,保持bash脚本在后台循环的最佳方法是什么



我创建了一个bash脚本来记录通过声卡的线路输入/mic端口输入的声音,当通过打破静音检测到声音时,它会记录到一个临时文件中,然后在一个新文件中标记日期,并将其添加到数据库中。

我需要实现的是一种很好的方法,让脚本在启动时启动,不断地运行脚本,如果无法重新启动,则重新启动。以下是我目前从各种来源整理的代码,到目前为止效果良好。但我需要它能够在没有任何用户交互的情况下全天候运行。

这是我创建的第一个真正的bash脚本,所以我希望对我使用的方法有一个更有经验的输入,以及它是对是错。

我确实尝试过通过启动-停止守护进程进行守护,但最终得到了多个正在运行的脚本和sox命令。目前我在rc.local中的启动时执行它,就我个人而言,我不认为在脚本底部再次添加命令来重新启动脚本是正确的方式。。。但我不知道还有其他办法。

任何形式的帮助都将不胜感激。

#!/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

要重新启动脚本,您可以通过crontab crontab Howto 调用它

您是否尝试过对脚本进行后台处理?不同的操作系统都有自己的文档,说明如何守护脚本并将其添加到系统启动中。看看你的问题,我相信这就是你必须做的。但要小心使用系统资源,并包括适当的睡眠时间,以尽量减少系统资源的使用。

Else还建议添加一个cron作业,因为它不会一直在后台运行。

@Gurubaran这是新代码,它曾经派生出一个新进程,但现在我通过一个调用自己的函数使用循环,所以它不会派生,尽管sox命令是一个单独的派生,但它是必要的,我确保我只是在瞬间杀死sox。这一切看起来还好吗?它似乎运行得很好。当我收到电缆时,我需要对其进行适当的测试,以测试它的用途,而不是我的手机。脚本也通过启动-停止守护程序进行守护程序化

#!/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 

最新更新