Bashスクリプトのジョブ制御

Bashスクリプトのジョブ制御

私は数千行のBashスクリプトを持っていますが、各行には1つのffmpegコマンドが含まれています。私はこれを始めて、source script素晴らしく運営されています。

ただし、このスクリプトをさまざまな方法で制御しようとすると、状況は完全に間違っています。

  • Ctrl + Zすべて一時停止すると現在の ffmpeg一時停止コマンドとNextここに行く!私が欲しいものではありません!
  • すべてを停止すると、Ctrl + Cスクリプトは次のffmpegコマンドに移動し、最終的にすべてを停止するには、スクリプトの各行に1回押す必要があります。純粋な地獄。
  • ps -ef別のシェルで一時停止/終了するコマンドを見つけようとしましたが、sourceリストには存在しません。

それでは、私が望む方法で親スクリプトを一時停止/停止するにはどうすればよいですか?または、スクリプトを適切に制御できるようにスクリプトを異なる方法で実行するにはどうすればよいですか?

答え1

スクリプトをインポートするのではなく、スクリプトをスクリプトとして実行してみてください。

$ bash <scriptname>

答え2

問題は、-sent-シグナルffmpegをキャプチャしますが、シグナルがそのシグナルにも使用されているかどうかわからないため、bashでは無視されることです。SIGINTCtrl+C

この問題を解決する1つの方法はスクリプトからシグナルを取得し、ローカルで処理します。

たとえば、ファイルの先頭にトラップを追加するには、コマンドを使用します。次に実行可能にし、次のいずれかを実行して実行します
$ bash script_fileいいえsource:

trap 'exit' INT

メッセージとメッセージで終わるもう少しエキゾチックな回線終了ステータス130:

trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT

それから:

$ ./file_with_commands

または調達キラースクリプト:

#!/bin/bash

trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT

source "$1"

それから:

$ ./sourcetrap file_with_commands

簡単なサンプルスクリプトは次のとおりです。

#!/bin/bash

if [[ $1 = trap ]]; then
    trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT
fi

ping localhost
ping localhost
ping localhost
  • トラップなしで実行:./script_name
  • トラップ付き:./script_name trap

その後、Ctrl+C違いを目撃してください。


それではもう一度やらないでください。sourceこれらのスクリプトは端末プロンプトで提供されます。

関連情報