pdsh를 파일에서 가져올 수 있나요?

pdsh를 파일에서 가져올 수 있나요?

다음과 같이 한 명령에서 다른 명령으로 데이터를 전송할 수 있습니다.

$ echo test | cat
test

무엇으로 전화해야 할지 잘 모르겠습니다.다음을 사용하여 비슷한 효과를 얻을 수 있습니다.

$ cat < <(echo test)
test

<(echo test)즉석에서 파일을 만드는 것은 부끄러운 일이 아닙니다. 일반 파일을 사용하면 다음과 같습니다.

$ cat file
test
$ cat < file
test

이것은 ssh와 마찬가지로 작동합니다.

$ ssh server cat < <(echo test)
test

ssh-example을 기본으로 사용하면 다음과 같이 할 수 있다고 생각할 수도 있습니다.

$ pdsh -a cat < <(echo test)

그러나 연결된 시스템의 cat에는 데이터가 전송되지 않으며 명령이 종료되지 않습니다.

tee표준 입력으로 받은 내용을 여러 곳으로 보낼 수 있는 것 같습니다.

$ tee >(cat) >(cat) < <(echo test) 
test
test
test

같은 목표를 달성하는 것이 가능합니까 pdsh?

답변1

표준 입력 전달/브로드캐스팅은 지원되지 않으므로 사용을 pdsh고려할 수 있습니다 .clushClusterShell 프로젝트드롭인 대체품으로 pdshstdin 브로드캐스팅을 지원합니다.

$ clush -a cat < <(echo test)
n1c01: test
n2c01: test
n1c02: test
n2c02: test

또한 다음과 같은 clush우수한 출력 수집 기능(예: 외부 파이프가 필요하지 않음 dshback)이 있습니다.

$ clush -ab cat < <(echo test)
---------------
n[1-2]c[01-02] (4)
---------------
test

바라보다Clush에 대한 표준 입력 바인딩.

답변2

전체 명령이 원격 호스트에서 실행되도록 원격 명령을 인용해야 합니다. 예를 들어

pdsh -a 'cat < <(echo test)'

인용문이 없으면,오직cat원격 호스트에서 실행합니다. 리디렉션( <) 및프로세스 교체 <(echo test)로컬호스트에서 실행하세요.

이는 출력을 소비하는 원격 호스트가 하나만 있을 때 echo test(예: 명령 사용 ) 작동하지만 해당 출력을 소비하려는 원격 호스트가 여러 개 있는 경우(예: 시작 대신 사용하기 때문에) 작동합니다.sshpdshssh

답변3

저는 개발자 중 한 명에게 연락하여 pdsh다음과 같은 사실을 알게 되었습니다.

당신이 원하는 것은 "stdin Broadcast"입니다. 불행하게도 pdsh는 이에 대한 지원을 추가하지 않았습니다. 이것은 좋은 기능이지만 역사적으로 수요가 많지 않았기 때문에 완성되지 않았습니다.

이는 이 글에서 이미 확립된 내용을 확인시켜 주는 것 같습니다.

그러나 이는 다음과 같이 밀접하게 이어집니다.

그건 그렇고, 그렇지 않습니다불가능한표준 입력으로 방송합니다. srun(1) 등과 같이 HPC 스케줄러의 일부인 병렬 개시자가 이 작업을 수행할 수 있습니다. 메커니즘은 stdin을 한 번 읽은 다음 각 원격 프로세스의 버퍼에 복사하는 것입니다. 즉, 복사는 병렬 실행 프로그램 내부에서 수행됩니다.

후속 조치를 취하는 이유는 오해의 소지가 있는 답변이 있기 때문입니다.그 stackexchange 게시물.

직렬 for 루프 문제를 해결하는 또 다른 방법은 GNU Parallel 또는 pdsh -R exec에서 ssh를 실행하는 것입니다. pdsh -R exec의 예:

$ pdsh -R exec -w 호스트[0-10] bash -c 'ssh %h cat < <(에코 테스트)'

물론 여기서 단점은 리디렉션을 위한 임시 파일을 N번 생성한다는 것입니다. 아마도 더 나은 접근 방식은 출력을 로컬 파일에 넣은 다음 해당 파일을 각 ssh 명령에 추가하는 것입니다.

for 루프에 비해 pdsh/parallel의 장점은 병렬성을 달성할 수 있다는 것입니다.

내 테스트에서는 이 예제가 작동하는 데 몇 가지 문제가 있었습니다.

root@master# pdsh -R exec -w host1 bash -c 'ssh %h cat < <(echo test)'
host1: bash: -c: line 0: syntax error near unexpected token `<'
host1: bash: -c: line 0: `ssh n1 cat < <(echo test)'
pdsh@master: host1: bash exited with exit code 1

활기를 주기 위한 작은 조정은 "일반" 파일을 사용하는 것입니다:

root@master# cat data.txt
test from file
root@master# pdsh -R exec -w host1 bash -c 'ssh %h cat < data.txt'
host1: test from file

결론: pdsh내 요구 사항을 더 잘 처리할 수 있는 기능을 개발할 수 있지만 지금도 내 요구 사항을 충족할 수 있는 방법이 있습니다.

답변4

데이터를 여러 머신에 전송하려는 이유는 임시 파일에 쉽게 넣어서 원격 머신으로 파일을 전송할 수 없기 때문이라고 생각합니다. 출력이 지속적으로 생성될 수도 있고 너무 커서 디스크에 맞지 않을 수도 있습니다.

GNU Parallel은 --tee다음을 도와줄 수 있습니다.

seq 1000 |
  parallel --tee --pipe ssh {} wc ::: server1 server2

seq 1000wc명령을 바꾸십시오 .

수정되지 않은 GNU/Linux 시스템에서는 250개의 서버에서 실행되어야 합니다. 더 필요한 경우 파일 핸들이 부족하여 또는 에서 ulimit -n또는 을 변경해야 합니다 .nofile/etc/security/limits.conf/proc/sys/fs/file-max

뒤에서 다음이 시작됩니다(GNU Parallel이 명령에서 stdout 및 stderr을 수집하기 때문에 이는 좀 더 복잡하지만 원칙은 동일합니다).

... | tee >(ssh server1 wc) >(ssh server2 wc) >/dev/null

따라서 성능은 동일합니다 . 그러나 이는 동시에 몇 대의 서버가 아닌 모든 서버가 병렬로 작동한다는 tee의미이기도 합니다 .ssh

관련 정보