背景:我的项目用ffmpeg下载直播视频,有些下载的文件已经删除了,但用ps -ef|grep ffmpeg查看发现有些下载这个文件的ffmpeg进程仍然在运行。这个问题的根本原因肯定是因为我对ffmpeg的用法不太对,没找到最佳实践,但为了解决当前的问题,我打算写一个脚本用来杀掉已经删除掉下载文件的对应进程。
最终脚本如下:
#!/bin/bash
# when file is deleted,ffmpeg download process not end,the script should kill the useless process.
downloadPaths=$(ps -ef|grep ffmpeg | grep data3 |awk '{print $2,$13}') # 取出进程号和文件路径
processIds=$(echo "$downloadPaths" |awk '{print $1}') #取出进程号
paths=$(echo "$downloadPaths" |awk '{print $2}') #取出文件路径
processArray=(${processIds}) #字符串转成数组
pathsArray=(${paths})
length=${#processArray[@]} #取数组长度
for ((i=0;i<length;i++));
do
if [ ! -e "${pathsArray[i]}" ]; then # 如果文件不存在,则将进程杀掉
kill -9 ${processArray[i]}
fi
done
然后再讲其添加到crontab中,执行crontab -e,添加如下:
*/30 * * * * /usr/bin/sh /aa/bb/cleanFfmpegProcess.sh
:wq即可。