RUDE

Ruby net/ssh не запускает команды bash в фоновом режиме

Мне трудно запускать команды bash в фоновом режиме из скрипта Ruby.

Для этого вопроса я использую упрощенный пример.

Вот как команды работают должным образом, когда я запускаю их из PuTTY.

запуск команд basch в фоновом режиме (нажмите, чтобы увидеть картинку, потому что StackOverlow еще не позволяет мне показывать картинки)

Теперь я пытаюсь воспроизвести это из Ruby, используя этот небольшой скрипт, показанный ниже:

рубиновый скрипт (нажмите, чтобы увидеть картинку, потому что StackOverlow еще не позволяет мне показывать картинки)

Вот что я получаю, когда запускаю такой Ruby-скрипт:

вывод скрипта (нажмите, чтобы увидеть картинку, потому что StackOverlow еще не позволяет мне показывать картинки)

Для вашего анализа вот транскрипция скрипта Ruby:

require 'net/ssh'
net_remote_ip = '74.****122'
ssh_username = 'bots'
ssh_password = 'San*****'
get_ssh_port = '22'
ssh = Net::SSH.start(net_remote_ip, ssh_username, :password => ssh_password, :port => get_ssh_port)
s = "bash --login -c 'sleep 600' &"
print "run (#{s})... "
stdout = ssh.exec!(s)
puts "done (#{stdout.strip})"
ssh.close
exit(0)

18
1

Ответ:

Решено

Вам нужно перенаправить как stdout, так и stderr куда-то еще, кроме терминала, иначе exec! будет зависать в ожидании вывода процесса.

Это самое простое решение, которое я нашел:

ssh.exec!("sleep 600 &> /dev/null &")

&> перенаправляет как stdin, так и stderr одновременно. Если вы хотите перенаправить вывод для ведения журнала, вы можете сделать это отдельно, если хотите:

ssh.exec!("command 2> error.log > output.log &")