クラスの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を停止する方法についてのアドバイスは素晴らしいでしょう。これは、理想的には、設定された時間に実行されるように設定されるため、人間の相互作用を回避することが不可欠です。
あなたのパイプライン
ps -aux | grep sox | kill 0
あなたがやりたいことはしません。これは、kill
がgrep
からの入力を読み取らないためです(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
コマンド(バックグラウンドで実行中)が完了するまで待機します。
前のセッション で説明したように、すべての変数展開を二重引用符で囲みます。
これは正常に動作しています:
#!/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
kill -SIGINT <pid>
は通常、^C
と同等です。
トラッピングを使用:
#!/bin/bash
# this is a trap for ctrl + c
trap ctrl_c INT
function ctrl_c()
{
echo "Trap: CTRL+C received, exit"
exit
}