web-dev-qa-db-ja.com

実行中のプロセスの最初のインスタンス以外のすべてのインスタンスを強制終了します

私は、2つのファイルからリアルタイムのミキシングボイスオーバーを作成するために、いくつかのインスタンスを実行するためにmplayerが必要なプロジェクトに取り組んでいます。そのため、音楽は常に90%の音量(次のタイムラインでは「M」で表されます)で再生され、特定の瞬間に音量(「m」)を下げて音楽に音声(「V」)をかけます。音声サンプルが終了したら、音楽を90%に戻します。

タイムライン(分)

0===========1===========2===========3===========4===========...
_____________VVVVVVVV__________VVVVVVVVVVVVVV__________VVVVV...
MMMMMMMMMMMMMmmmmmmmmMMMMMMMMMMmmmmmmmmmmmmmmMMMMMMMMMMmmmmm...

これまでのところ、すべてがかなりうまく機能しています。しかし、何らかの理由で、多くの場合、2番目のmplayerインスタンスがボイスオフ再生を終了しますが、プロセスはまだアクティブのままであり、終了することはありません。

答えはここにあります: スクリプトを実行しているプロセスを除くすべてのプロセスを殺す はこの場合動作していません。

私もこの質問で受け入れられた答えを試しました: https://unix.stackexchange.com/questions/50555/kill-many-instances-of-a-running-process-with-one-command =しかし、これはmplayerのすべてのインスタンスを強制終了し、最初のインスタンスが常に音楽を再生し続ける必要があります。

このページでは http://www.oracleflash.com/20/How-to-kill-all-processes-with-one-command-in-Linux.html 彼らはすべてを殺す方法を再現しますアプリケーションによって開始されたプロセス。これはこの場合に非常に便利ですが、これはmplayerのすべてのインスタンスも強制終了します。

期待される解決策

私は音楽プレーヤーのPIDを次のように保存しています:

mplayer -shuffle -playlist playlist.m3u </dev/null >/dev/null 2>&1 & echo $! > player.pid

そのPID番号を使用して、player.pidファイルに保存されているすべてのプロセスEXCEPTを強制終了するために、最後に指定されたページのソリューションを使用したいと思います。そのため、cat player.pidを中央に配置します

kill -9 `ps -ef | grep oraxpo | grep -v grep | awk '{print $2}' 

トリックを行うことがあります。

問題は、どこに配置するかわからないことです。または、別の/より良い方法がある場合。

別のアイデアは、最後のプロセスを一度に1つずつ強制終了し、最初のプロセスで停止することです。

どんなアイデアでも大歓迎です。

前もって感謝します。

あなたが試すことができます:

pgrep mplayer | grep -vf player.pid | xargs kill -9

ノート:

  • pgreptheプロセス情報を検索するためのツールです。一致の否定とPIDファイルの使用もサポートしていますが、残念ながら、選択的に一致を否定する方法がわかりませんでした。
  • ファイルがあるので、-fを使用してファイルからgrepを読み取り、-vとの一致を否定するだけです。
  • xargsは入力を引数に変換するため、コマンド置換を使用する必要はありません
3
muru