나는 이 코드를 가지고 있습니다 :
for i in $ipb $ipc $ipd; do
ssh -i ~/.ssh/'key' 'name'@${i} /bin/bash << EOF
nohup ${install_dir}/redis-stable/src/redis-server ${install_dir}/${port}/node.conf &
EOF
let "port++"
done
이렇게 하면 3개의 IP 주소 모두에서 Redis 서버가 시작됩니다. 그러나 현재는 첫 번째 명령(ipb에서)만 실행합니다. 참고: nohup-ed 명령을 수동으로 입력하는 경우 Redis 서버가 이 명령으로 시작되면 사용자는 다른 명령을 입력하기 전에 Enter 키를 눌러야 합니다. 이 문제는 redis와는 관련이 없으나, 스크립트 작성 방식에 따른 문제일 가능성이 높으므로 Redis에 대한 지식은 필요하지 않다고 생각합니다. SSH도 잘 작동합니다.
3개의 명령(각 IP당 하나씩)을 모두 실행하려면 무엇을 변경해야 합니까?
시간을 내주셔서 감사합니다. 더 많은 정보가 필요하면 언제든지 알려주시기 바랍니다.
답변1
설명하다
명령( /bin/bash
)을 없이 지정했으므로 원격 측에는 tty가 할당되지 않았습니다. 그런 다음 두 가지 일이 발생합니다.ssh
-t
nohup
표준 스트림을 리디렉션하지 마십시오(tty가 있으면 괜찮아);SSH 서버가 eof를 기다립니다.로컬은 연결이 끊어질 때까지 계속 실행됩니다
ssh
.eof는 파이프의 쓰기 측 프로세스에 대해 열려 있는 파일 설명자가 없을 때 발생합니다. 이는 일반적으로 stdout이 다른 것으로 리디렉션되지 않은 모든 프로세스가 사라진 경우에만 발생합니다.
표준 스트림을 리디렉션합니다.당신이 대답에서 그랬어요SSH 서버가 조기에 연결 해제되도록 합니다.
답변2
문제를 발견하면 nohup 줄 끝(& 바로 앞)에 추가하세요.
> foo.out 2> foo.err < /dev/null
올바른 방향을 알려준 @berndbausch에게 감사드립니다!