다양한 프로그램을 실행하려면 여러 대의 컴퓨터를 연결해야 합니다. 컴퓨터마다 다른 명령을 보내야 합니다. ssh 명령을 사용하여 여러 컴퓨터를 연결하고 각 컴퓨터에 다른 명령을 보내는 방법은 무엇입니까? 각 컴퓨터에 대해 프로그램을 실행하는 명령은
nohup Rscript program_i.R > program_i_out.txt
. 좀 더 구체적으로 설명하세요. 3개의 컴퓨터를 사용하여 3개의 프로그램을 실행하고 싶습니다. 그럼 내가 보내줄게
nohup Rscript program_1.R > program_1_out.txt
첫 번째 컴퓨터로,
nohup Rscript program_2.R > program_2_out.txt
두 번째 컴퓨터로,
nohup Rscript program_3.R > program_3_out.txt
세 번째 컴퓨터로.
답변1
노력하다 ssh -f user@host '<your command here>'
.
SSH 매뉴얼 페이지에서:
-f Requests ssh to go to background just before command execution. This is useful if ssh is going to ask for passwords or passphrases, but the user wants it in the background.
예를 들어 이렇게 하면 ssh -f <my computer> 'echo "hello $(pstree -p | grep sshd | wc -l) person in ssh!"
가 인쇄됩니다 hello 1 person in ssh!
.
2를 인쇄한 후 세션이 자동으로 종료되지만 종료될 때까지 기다릴 필요는 없습니다. 이렇게 하면 ssh -f <my computer> 'sleep 30 && echo "hello $(pstree -p | grep sshd | wc -l) person in ssh!"'
아무 일도 일어나지 않는 것처럼 보이고 정상적으로 모든 작업을 수행할 수 있지만 30초 후에는 hello 1 person in ssh!
.
리디렉션을 사용하면 >
모든 표준 출력이 파일로 리디렉션되지만 모든 오류는 여전히 화면에 인쇄됩니다. 이를 방지하려면 &>
모든 출력(stdout 및 stderr)을 파일로 리디렉션하는 방법을 사용할 수 있습니다 .
답변2
SSH는 여러 가지 방법으로 호출할 수 있습니다. 사람들이 그것을 부르는 가장 일반적인 방법은 다음과 같습니다.
ssh user@host
그러면 대화형 터미널이 열립니다. 그러나 SSH에서는 실제로 다음과 같은 호출 방법이 있습니다.
ssh user@host /usr/bin/foo
따라서 첫 번째 유형은 기본적으로 bash를 연결하고 실행하므로 편리합니다. 기본적으로 다음과 같은 작업을 수행합니다.
ssh user@host sh
sh
이 시스템의 인클로저는 어디에 있습니까 bash
?
논의를 위해 실행해야 하는 명령이 이라고 가정해 보겠습니다 mycommand
.
(이것을 단순화하는 이유는 예제로 제공한 명령에 nohup
출력 리디렉션이 포함되어 있기 때문입니다. 즉, 명령을 올바르게 이스케이프해야 함을 의미합니다. 또한 nohup
SSH 연결이 종료된 후에도 명령을 유지하는 데 어려움을 겪고 있다면 setsid
이를 사용하여 세션 리더로 만들고 싶을 수도 있습니다 . 두 경우 모두 &
)를 사용하여 비동기 명령으로 만듭니다.
컴퓨터마다 다른 명령을 보내야 합니다.
이 작업을 수행하는 방법을 지정하지 않았습니다. 예를 들어, 기계는시작하다SSH 연결에 따라 실행되는 명령이 결정됩니까, 아니면 원격 시스템의 구성에 의해 지정됩니까?
다양한 원격 컴퓨터에 대한 연결을 시작하는 컴퓨터가 작성할 명령을 결정해야 하는 경우 해당 정보를 어딘가에 저장하고 사용해야 합니다.
이를 달성하는 한 가지 방법은 기본적으로 다음을 호출하므로 데이터를 SSH로 파이프하는 것입니다 bash
.
cat command.txt | ssh user@host
cat comand.txt
지금은 해당 정보를 어떻게 저장할지 모르기 때문에 SSH로 전송해야 하는 명령을 생성하기 위해 여기 예제를 사용하고 있습니다 . 다음과 같이 모든 정보를 텍스트 파일에 저장하는 것이 가장 쉬운 방법일 것입니다.
user host command
user2 host2 command2
user3 host3 command3
sed
이제 이 작업을 수행하기 위한 파이프라인을 생성할 수 있습니다. 하지만 조금 더 복잡합니다( 또는 같은 파서를 사용해야 합니다 awk
). Perl이나 PHP와 같은 가벼운 스크립팅 언어를 사용하는 것이 더 쉬울 수도 있습니다.
<?php
foreach (file('myfile.txt') as $line) {
list($user, $host, $command) = explode(' ', $line);
passthru("ssh $user@$host $command");
}