다음과 같이 한 명령에서 다른 명령으로 데이터를 전송할 수 있습니다.
$ 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
고려할 수 있습니다 .clush
ClusterShell 프로젝트드롭인 대체품으로 pdsh
stdin 브로드캐스팅을 지원합니다.
$ 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
(예: 명령 사용 ) 작동하지만 해당 출력을 소비하려는 원격 호스트가 여러 개 있는 경우(예: 시작 대신 사용하기 때문에) 작동합니다.ssh
pdsh
ssh
답변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 1000
및 wc
명령을 바꾸십시오 .
수정되지 않은 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