我有一个通过 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,则屏幕将按预期工作,创建一个新分离的窗口,在其中运行 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
尝试使用您的命令强制使用 psuedo-tty 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
) 调用。