소개하다
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 $cmd
conda 환경이 로드되도록 하는 것입니다. 불행하게도 이로 인해 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에서 참조된 것 같습니다.