web-dev-qa-db-ja.com

Control + Cなどでスクリプトプロセスを停止する

クラスのAVバグRaspberry Piを作成しようとしています。

私はsoxを使って音を録音しています。これは正常に機能しています。

問題は、soxを停止して新しいファイルを作成し、Ctrl + Cで停止する必要があることです。 killallが別のsshセッションから送信された場合、他のセッションは削除され、soxはファイルを作成しません。

listen.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

それを停止するための別のスクリプトを作成してみました。ほとんど

killlisten.sh

#! /bin/bash
sleep 5;
ps | grep sox | kill 0;

次に、

superscript.sh

#! /bin/bash
./listen.sh;
./killlisten.sh;

それでも出力ファイルを生成する方法でsoxを停止する方法についてのアドバイスは素晴らしいでしょう。これは、理想的には、設定された時間に実行されるように設定されるため、人間の相互作用を回避することが不可欠です。

1

あなたのパイプライン

ps -aux | grep sox | kill 0

あなたがやりたいことはしません。これは、killgrepからの入力を読み取らないためです(grepの結果にもが含まれますsoxプロセスのPIDだけではありません)。

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はその番号に置き換えられます)。

& ofteを使用すると、soxの呼び出しでバックグラウンドに配置されます。そのバックグラウンドタスクのPIDは自動的に$!に格納され、上記のコードはそれをsox_pidに割り当て、後で印刷されます。

waitコマンドは、soxコマンド(バックグラウンドで実行中)が完了するまで待機します。


前のセッション で説明したように、すべての変数展開を二重引用符で囲みます。

2
Kusalananda

これは正常に動作しています:

#!/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
0
Manas

kill -SIGINT <pid>は通常、^Cと同等です。

0
L29Ah

トラッピングを使用:

#!/bin/bash

# this is a trap for ctrl + c 
trap ctrl_c INT

function ctrl_c() 
{
  echo "Trap: CTRL+C received, exit"
  exit
}
0
karmax