Control + C 또는 기타 명령을 사용하여 스크립트 프로세스를 중지합니다.

Control + C 또는 기타 명령을 사용하여 스크립트 프로세스를 중지합니다.

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

관련 정보