Bash macOS 터미널 Ctrl+C는 모든 프로세스를 종료합니다.

Bash macOS 터미널 Ctrl+C는 모든 프로세스를 종료합니다.

rsync출력을 사용자 정의 함수로 파이프하고 그에 따라 사용자 정의 정보를 출력하는 데 사용하려고 합니다 .

log_output() {
  while read -r dir; do
    last_slash_index=$(echo $dir | awk -F "/" '{print length($0)-length($NF)}')
    echo ${dir:(($last_slash_index))}
  done
}

rsync -avnh "/src/" "/dest" | log_output

이 특정 인스턴스에서 출력되는 디렉터리 중 마지막 디렉터리 에는 /. 중지되었음에도 ctrl+c불구하고 rsync(출력에서 볼 수 있듯이), 잠시 동안 나만의 구문 분석 결과가 여전히 터미널에 출력되고 있습니다. 를 누르면 ctrl+c모든 것이 종료되도록 코드에 추가할 수 있는 것이 있습니까?

답변1

control+의 신호는 c포그라운드 프로세스 그룹의 모든 프로세스가 응답하는 데 시간이 걸릴 수 있습니다. 특히 시스템이 매우 사용량이 많거나 프로세스가 I/O에서 차단된 경우 더욱 그렇습니다. (이것은 터미널이 신호를 생성하지 않도록 구성되지 않았다고 가정합니다. 자세한 내용은 해당 플래그에 대한 설명서를 termios참조하십시오 ISIG. 그러나 귀하의 질문에는 이에 대한 표시가 없습니다.) 실시간 OS의 타이밍이 더 나을 수도 있지만 종종 그렇습니다. 기본적으로 유닉스에서는 그렇지 않습니다. "지금 중지하세요!"가 발생했을 때 파일이 중간에 기록되면... 중지하고 출력을 손상시킬 수 있습니까? 잠시 기다렸다가 I/O가 새로 고쳐지길 바라나요? 얼마나 더?

신호 처리기( trap셸 또는 인터페이스 위에 구축된 다른 모든 것 sigaction(2))는 복잡한 전경 프로세스 그룹(셸 파이프)과 마찬가지로 상황을 복잡하게 만듭니다. 기준으로 control+가 어떻게 작동하는지 볼 수 c있으며 복잡한 작업을 수행해서는 안 됩니다.yescat

$ yes | cat

그러나 터미널이 모든 출력을 표시하는 중이므로 yes응답이 느릴 수 있습니다. 이 요소는 다음을 통해 제거할 수 있습니다.

$ yes | cat > /dev/null

심지어

$ yes > /dev/null

control+에 대한 응답이 느리다면 c시스템이 다른 작업을 실행 중일 수 있습니까?

그렇지 않으면 이와 같이 덜 빠른 언어로 파이핑하면 bash각 입력 줄과 일부 추가 코드에 대해 새로운 echo awk 파이프라인이 생성되며, 이는 특히 시스템이 많은 수의 프로세스를 분기하는 데 능숙하지 않은 경우 더욱 느려질 것입니다. awk모든 계산을 자체적으로 수행하는 스크립트(또는 다른 프로그래밍 언어) 로 출력을 파이프하는 것이 더 효율적이며 더 중요한 것은느리고 버벅거림 while readbash이렇게 하면 + controlc더 빠른 응답을 얻고 CPU를 덜 사용하게 됩니다.

$ echo /etc/passwd | awk -F "/" '{print $0, length($0)-length($NF)}'
/etc/passwd 5
$ dir=/etc/passwd; echo ${dir:5}
passwd
$ echo /etc/passwd | awk -F/ '{print $NF}'
passwd

control+로 시도해 볼 수 있는 또 다른 방법은 c좀 더 간단할 수 있습니다.

rsync -avnh /src/ /dest | awk -F/ '{print $NF}'

이는 모든 쉘 기능이 수행하는 작업과 유사해 보이며 훨씬 더 CPU 효율적입니다.

관련 정보