我正在尝试通过 ssh 启动一个软件:
我可以 :
ssh -t [email protected]
screen -S datanode -d -m ~/hadoop/bin/hdfs datanode
但
ssh -t [email protected] screen -S datanode -d -m ~/hadoop/bin/hdfs datanode
不起作用
我尝试了几个带引号的选项:
ssh -t [email protected] screen '-S datanode -d -m ~/hadoop/bin/hdfs datanode'
或者
ssh -t [email protected] screen -S datanode -d -m '~/hadoop/bin/hdfs datanode'
或者
ssh -t [email protected] screen ' -S datanode -d -m ~/hadoop/bin/hdfs datanode'
但我找不到正确的:-(
答案1
最好将选项分组在一起
ssh -t username@host "screen -dmS 'NAMEofSCREEN' command"
然后你可以重新连接
screen -r NAMEofSCREEN
请记住,如果command
退出,这将不是一个可重新连接的屏幕。例如:
ssh -t username@host "screen -dmS 'NAMEofSCREEN' echo | wall"
将会给您wall
消息...
Broadcast message from user@host (pts/15) (Tue Jan 16 12:04:07 2018):
..但命令运行成功后屏幕将立即关闭
答案2
我发现你的咒语有两个(潜在的)问题
ssh -t remote screen -S datanode -d -m ~/hadoop/bin/hdfs datanode
- 这客户/本地shell(执行 的那个
ssh
)会扩展~
并替换 的值$HOME
,该值可能与远程服务器的值不同。建议您使用相对路径(例如./hadoop/bin/hdfs
)或完全限定路径,或者用单引号引用远程命令(例如 '~/hadoop/bin/hdfs datanode')以防止在客户端扩展。 - 因为该
screen
命令正在启动一个分离的实例,但仍然是 ssh 启动的 shell 的子进程,所以当远程 shell 退出时它会终止。
此外,由于屏幕创建了自己的 tty,因此您不需要-t
选项ssh
。
尝试使用在命令执行之前-f
告诉ssh
进入后台。即:
ssh -f remote screen -S datanode -d -m ./hadoop/bin/hdfs datanode
同样有效的替代方案nohup
:
ssh remote nohup screen -S datanode -d -m ./hadoop/bin/hdfs datanode