我正在尝试为班级制作一个 AV bug 树莓派。
我正在使用 sox 来录制声音。效果很好。
问题是 sox 需要通过 control+C 来停止并创建新文件。如果从不同的 ssh 会话发送killall,它将删除另一个会话,并且 sox 不会创建该文件。
听.sh
#! /bin/bash
NOW=$( date '+%F_%H:%M:%S' )
filename="/home/pi/gets/$NOW.wav"
sox -t alsa plughw:1 $NOW.wav;
sleep 6;
echo $filename
我尝试制作一个单独的脚本来停止它;差不多
杀听.sh
#! /bin/bash
sleep 5;
ps | grep sox | kill 0;
然后运行一个
上标.sh
#! /bin/bash
./listen.sh;
./killlisten.sh;
任何有关如何以仍会生成输出文件的方式阻止 sox 的建议都会很棒。理想情况下,这将设置为在设定的时间运行,因此避免人机交互至关重要。
答案1
您的管道
ps -aux | grep sox | kill 0
不会做你想做的事。这是因为kill
永远不会读取来自的输入grep
(来自的结果grep
也将包含很多除了进程的 PID 之外还有其他信息sox
)。
如果你有pkill
,就这样做
pkill sox
相反(用于pkill -INT sox
发送与之前相同的信号Ctrl+C)。
如果您将启动脚本更改为
#!/bin/bash
NOW=$( date '+%F_%H:%M:%S' )
filename="/home/pi/gets/$NOW.wav"
sox -t alsa plughw:1 "$NOW.wav" & sox_pid="$!"
printf 'sox pid is %d\n' "$sox_pid"
wait
# Alternatively (instead of "wait", if you want to kill sox after six seconds):
# sleep 6 && kill "$sox_pid"
echo "$filename"
sox
您将获得打印到终端的进程的 PID ,并且您可以使用它来执行kill pid
(用pid
该数字替换)。
&
通常,调用sox
会将其置于后台。该后台任务的 PID 会自动存储在其中,$!
并且上面的代码会将其分配给sox_pid
稍后打印。
该wait
命令等待sox
命令(在后台运行)完成。
正如我们在上一届会议:双引号所有变量扩展。
答案2
使用陷印:
#!/bin/bash
# this is a trap for ctrl + c
trap ctrl_c INT
function ctrl_c()
{
echo "Trap: CTRL+C received, exit"
exit
}
答案3
kill -SIGINT <pid>
通常相当于^C
.
答案4
这工作正常:
#!/bin/sh
# This script will do exactly the same job of Ctrl^C for background process
# find the PID of running script
pid=$(ps -ef| grep <scriptname>)
echo ".... PSR Stats collection script PID:"+$pid +"is getting exited abruptly"
# exit the process
kill -INT $pid