Отсоединенный экран на удаленном хосте

Отсоединенный экран на удаленном хосте

У меня есть локальный скрипт, который запускает удаленный скрипт через ssh. Локальный скрипт — minecraft.php:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i {$this->pemkey} {$this->ssh_user} sudo /vol/start_bukkit.sh

Удаленный скрипт — /vol/start_bukkit.sh:

#!/bin/bash
cd "/vol/bukkit"
/usr/bin/screen -S bukkit -m -d /usr/local/bin/java -Xnoclassgc -Xms1024M -Xmx1024M -jar /vol/bukkit/craftbukkit.jar nogui

Что происходит, так это то, что команда java работает, запуская craftbukkit.jar, но screen не запускает новое окно. Что происходит? Как можно создать новое окно?

Если я вхожу на удаленный сервер и запускаю start_bukkit.sh, то screen работает так, как и ожидалось, создавая новое отсоединенное окно, в котором запущен craftbukkit.jar.

РЕДАКТИРОВАТЬ:

Я заставил это работать. Я обновил локальный скрипт, удалив sudo и вставив команду screen. Вот он:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i {$this->pemkey} {$this->ssh_user} /usr/bin/screen -S bukkit -m -d /vol/start_bukkit.sh

На удаленной стороне я удалил команду screen:

#!/bin/bash
cd "/vol/bukkit"
/usr/local/bin/java -Xnoclassgc -Xms1024M -Xmx1024M -jar /vol/bukkit/craftbukkit.jar nogui

Я не могу объяснить, почему это работает.

решение1

Попробуйте принудительно запустить псевдотерминал с помощью sshкоманды.

ssh -t -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i
{$this->pemkey} {$this->ssh_user} sudo /vol/start_bukkit.sh


man 1 ssh

     -t      Force pseudo-tty allocation.  This can be used to execute
             arbitrary screen-based programs on a remote machine, which 
             can be very useful, e.g. when implementing menu services.  
             Multiple -t options force tty allocation, even if ssh has 
             no local tty.

Кроме того, в вашем скрипте start_bukkit.shне установлен PATH. Вы вызываете javaбез абсолютного пути, поэтому он может быть не найден. Либо установите PATH в начале скрипта (лучшая практика), либо вызовите javaчерез абсолютный путь ( /usr/bin/java).

Связанный контент