
У меня есть локальный скрипт, который запускает удаленный скрипт через 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
).