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있으며 복잡한 작업을 수행해서는 안 됩니다.yes
cat
$ yes | cat
그러나 터미널이 모든 출력을 표시하는 중이므로 yes
응답이 느릴 수 있습니다. 이 요소는 다음을 통해 제거할 수 있습니다.
$ yes | cat > /dev/null
심지어
$ yes > /dev/null
control+에 대한 응답이 느리다면 c시스템이 다른 작업을 실행 중일 수 있습니까?
그렇지 않으면 이와 같이 덜 빠른 언어로 파이핑하면 bash
각 입력 줄과 일부 추가 코드에 대해 새로운 echo awk 파이프라인이 생성되며, 이는 특히 시스템이 많은 수의 프로세스를 분기하는 데 능숙하지 않은 경우 더욱 느려질 것입니다. awk
모든 계산을 자체적으로 수행하는 스크립트(또는 다른 프로그래밍 언어) 로 출력을 파이프하는 것이 더 효율적이며 더 중요한 것은느리고 버벅거림 while read
bash
이렇게 하면 + control는 c더 빠른 응답을 얻고 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 효율적입니다.