SSH를 통해 원격 호스트에서 백그라운드 작업을 시작하면 호출 스크립트가 중단됩니다.

SSH를 통해 원격 호스트에서 백그라운드 작업을 시작하면 호출 스크립트가 중단됩니다.

나는 이 코드를 가지고 있습니다 :

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에게 감사드립니다!

관련 정보