在启动时保持 bash 脚本在后台循环的最佳方法是啥 - Linux?
Posted
技术标签:
【中文标题】在启动时保持 bash 脚本在后台循环的最佳方法是啥 - Linux?【英文标题】:What is the best way keep a bash script looping in the background on startup - Linux?在启动时保持 bash 脚本在后台循环的最佳方法是什么 - Linux? 【发布时间】:2014-02-19 00:34:21 【问题描述】:我创建了一个 bash 脚本来记录通过声卡的线路输入/麦克风端口输入的声音,当通过打破静音检测到声音时,它会记录到临时文件中,然后在新文件中添加日期戳并添加到数据库中。
我需要实现的是使脚本在启动时启动的好方法,一遍又一遍地运行脚本,如果它无法自行重新启动,则重新启动。以下是我目前从各种来源汇总的代码,到目前为止它运行良好。但我需要它能够在没有任何用户交互的情况下 24/7 全天候运行。
这是我创建的第一个真正的 bash 脚本,因此希望对我使用的方法以及它是错误还是正确的有更经验的输入。
我确实尝试通过 start-stop-daemon 进行守护进程,但最终得到了多个正在运行的脚本和 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
【问题讨论】:
【参考方案1】:要重新启动脚本,您可以通过 crontab Crontab Howto 调用它
【讨论】:
是的,我已经知道 crontab,我以前用过很多次。但是你只能每分钟检查一次,对吗?我在想,使用 bash 肯定有一种方法可以让脚本继续运行,而无需在每次完成时都重新调用自己。 是的,您可以在需要开始时使用 crontab 进行调度(分钟、小时、天、周等)。如果你想在脚本完成后重新启动你的脚本,你可以在脚本中创建一个函数,然后像循环一样在执行完成时调用这个函数。 函数方法和调用本身已经创建了循环。现在,当它被守护时,它只有一次运行的脚本实例。我还测试了 kill sox,它正在听,它会重新循环并再次启动它。这是完美的。我将使用 cron 检查脚本是否正在运行,并将 cron 设置为记录它是否正在运行以查看它的执行情况。希望脚本的编写方式是正确的。感谢您的帮助!【参考方案2】:你试过守护你的脚本吗? 不同的操作系统都有自己的文档,说明如何守护脚本并将其添加到系统启动中。 看着你的问题,我相信这是你必须做的。但请注意使用系统资源并包括适当的睡眠时间,以尽量减少系统资源的使用。
Else 另外建议添加一个 cron 作业,因为它不会一直在后台运行。
【讨论】:
是的,我确实对脚本进行了守护,但最终运行相同脚本的许多进程,即'root 2693 0.0 0.2 2740 1160? S 08:53 0:00 /bin/bash /home/user/vox root 2913 0.2 0.2 2732 1112 ? S 08:57 0:00 /bin/bash /home/user/vox' 您的脚本是否分叉了一个新进程?此外,当作为普通 shell 脚本运行时,您的脚本必须以正确的返回值结束(即 echo $? 应该给您一个 0 以成功完成)。 您的代码对我来说看起来不错,但如果没有适当的缩进很难阅读:p...【参考方案3】:@Gurubaran 这是新代码,它用于分叉一个新进程,但现在我通过一个调用自身的函数使用循环,因此它不会分叉,尽管 sox 命令是一个单独的分叉,但这是必要的,我确保我杀了 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
【讨论】:
以上是关于在启动时保持 bash 脚本在后台循环的最佳方法是啥 - Linux?的主要内容,如果未能解决你的问题,请参考以下文章