Bash 스크립트에 대한 작업 제어

Bash 스크립트에 대한 작업 제어

나는 수천 줄의 Bash 스크립트를 가지고 있는데, 각 줄에는 하나의 ffmpeg명령이 포함되어 있습니다. 나는 이것을 시작했고 source script훌륭하게 운영되고 있습니다.

그러나 이 스크립트를 다양한 방법으로 제어하려고 하면 상황이 완전히 잘못됩니다.

  • Ctrl + Z전부 일시정지 하면현재의 ffmpeg일시 중지 명령 및다음여기 간다! 내가 원하는 건 아니야!
  • 모든 것을 중지 하면 Ctrl + C스크립트가 다음 ffmpeg명령으로 이동하고 최종적으로 모든 것을 중지하려면 스크립트의 각 줄에 대해 한 번씩 눌러야 합니다. 순수한 지옥.
  • ps -ef다른 셸에서 일시 중지/종료하는 명령을 찾으려고 시도 했지만 source목록에 존재하지 않습니다.

그렇다면 내가 원하는 방식으로 상위 스크립트를 일시 중지/중지하려면 어떻게 해야 합니까? 또는 스크립트를 적절하게 제어할 수 있도록 스크립트를 다르게 실행하려면 어떻게 해야 합니까?

답변1

스크립트를 가져오는 대신 스크립트를 스크립트로 실행해 보세요.

$ bash <scriptname>

답변2

문제는 -sent- 신호를 ffmpeg포착 하지만 신호가 해당 신호에도 사용되는지 알 수 없기 때문에 bash에서는 무시된다는 것입니다.SIGINTCtrl+C

이 문제를 해결하는 한 가지 방법은스크립트에서 신호를 가져와 로컬에서 처리합니다.

예를 들어, 파일 시작 부분에 트랩을 추가하려면 명령을 사용하십시오. 그런 다음 실행 가능하게 만들고 다음 중 하나를 수행하여 실행하십시오
$ 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이러한 스크립트는 터미널 프롬프트에서 제공됩니다.

관련 정보