Raspberry Pi 수업용 AV 버그를 만들려고 합니다.
나는 소리를 녹음하기 위해 sox를 사용하고 있습니다. 좋은 결과.
문제는 sox가 중지하고 새 파일을 생성하려면 Ctrl+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
나는 그것을 막기 위해 별도의 스크립트를 만들어 보았습니다.
Listen.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