sed를 통해 stderr를 필터링할 때 Bash 스크립트가 중단됩니다.

sed를 통해 stderr를 필터링할 때 Bash 스크립트가 중단됩니다.

소개하다

bash을 통해 작동하는 스크립트가 있는데 ssh, parallel병렬 버전에서는 GNU를 사용하고 순차 버전에서는 for 루프를 사용합니다.

스크립트는 다음과 같이 사용됩니다.

foreach_server "cd $dir && find -name '*.png' | wc -l"
foreach_server "cd $dir && git --no-pager status"

conda때때로 환경에서 실행 파일에 액세스해야 합니다 (https://docs.conda.io/en/latest/), 이 작업을 수행하기 위해 제가 찾은 유일한 방법은 대화형 셸을 사용하는 것입니다. 즉, bash -ic실행하려는 명령 바로 앞에 this 을 사용하여 ssh $host bash -ic $cmdconda 환경이 로드되도록 하는 것입니다. 불행하게도 이로 인해 stderr방지할 수 없는 두 가지 오류 메시지가 발생합니다.

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell

sed그래서 이 두 행을 제거 stderr하고 다음에서 다른 행을 전달 하는 필터를 만들었습니다 stderr.

ssh $host "$@" 2> >(sed -e "$filter1" -e "$filter2" >&2)

문제: sed 필터로 인해 병렬 버전이 중단됩니다.

필터는 sed순차 버전에서는 잘 작동하지만 병렬 버전은 스크립트 끝에서 중단되어 sed 프로세스가 활성화되어 있지만 아무 작업도 수행하지 않음을 나타냅니다. 이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?

문제가 프로세스 대체인 것으로 의심되지만 실제로 문제를 진단할 수는 없습니다.

참조 스크립트

#!/bin/bash
set -u

exit_trap() {
    echo "Interrupted"
    exit 1
}

trap exit_trap SIGINT

filter1='/^bash: cannot set terminal process group/d'
filter2='/^bash: no job control in this shell/d' 

hosts=("host1" "host2")  # more hosts in the real file

if [ -z ${serial+x} ];
then
    # Parallel version ==> THIS VERSION HANGS AT THE END, AFTER ALL OUTPUT HAS BEEN WRITTEN
    echo ${hosts[@]} | sed 's/ /\n/g' | parallel "echo ----- {} ----- && ssh {} \"$@\"" 2> >(sed -e "$filter1" -e "$filter2" >&2)
else
    # Serial version ==> THIS VERSION WORKS FINE
    for host in ${hosts[@]};
    do
        echo "------------------ $host ------------------"

        ssh $host "$@" 2> >(sed -e "$filter1" -e "$filter2" >&2)

        echo "--------------------------------------$(echo $host | sed 's/./-/g')"
    done
fi

답변1

오류 메시지의 증상을 제거하려고 애쓰는 것보다 오류 메시지의 원인을 제거하는 것이 더 좋습니다.

ssh그러면 터미널 ioctl을 적용할 수 있도록 세션에 tty가 할당됩니다 .

ssh -t $host "$@"

실제로 라인을 호출하는 방법에 따라 플래그를 두 배로 늘려야 할 수도 있습니다 -t.-tt

그러나 근본적인 문제는 conda 환경을 설정하기 위해 대화형 쉘이 필요하다는 것 같습니다. 그 이유는 에 있기 때문이 거의 확실합니다 ~/.bashrc. .이 작업을 명시적으로 수행하거나 관련 명령을 추출하여 스크립트에서 사용할 수 있습니다.

저도 잘 모르는데 conda질문이요.bashrc에서 conda 환경을 활성화하는 방법은 무엇입니까?~/.bashrc필요한 관련 부분은 AskUbuntu에서 참조된 것 같습니다.

관련 정보