使用 Control + C 或其他命令停止脚本进程

使用 Control + C 或其他命令停止脚本进程

我正在尝试为班级制作一个 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

相关内容