发生了什么:
我已经输入ssh root@ip nohup java -jar app.jar &
要在远程服务器上运行的 jar(该 jar 是 API 服务器)。
我的本地服务器正在获取 jar 日志,而不是写入远程服务器中的 nohup,并且我的 jar 正在运行但不起作用。
预期结果:
能够 从我的本地系统SSH EXEC
运行。nohup java -jar app.jar &
版本:
Ubuntu 18.04
更新:
仅当通过 putty 执行 jar cmd 时,jar 的 API URL 才会返回输出。
对于远程 ssh exec,jar 的 API URL 输出为 404
更新1:
我所需要的只是在我的远程服务器的后台运行 jar(从我的本地系统执行 cmd)。
答案1
nohup
和控制台输出......
重点是将输出重定向到空设备。
ssh user@host "sh -c 'cd /working/dir; nohup command -options > /dev/null 2>&1 &'"
# invoking sh makes output redirections easyier
ssh root@ip "sh -c 'nohup /path/to/java -jar /path/to/app.jar > /dev/null 2>&1 &'"
当然,输出可以保存到文件中
nohup some_command > output.log 2>&1 &
评论后编辑
通过 ssh 自动连接然后启动程序并进行交互(如显示输出日志),expect
可以解决问题。
expect
在本地机器上安装
sudo apt-get install expect
创建一个小脚本,命名它startItUp.sh
并使其可执行
#!/usr/bin/expect -f
spawn ssh user@host
# Its not recommended to insert a password in a script
# a good practice will be to copy key with ssh_copy_id
#expect "password: "
#send "myP@sswOrd\r"
# once ssh connection is enabled, lets expect for prompt
expect "$ "
# i got the prompt, i send a command
send "cd /go/to/needed/dir \r"
# again
expect "$ "
send "java -jar app.jar \r"
# let me interact (for example, i'll be able to ctrl+c)
interact
答案2
有趣的话题:)
首先,我认为必须使用单引号来引用远程命令。关于这一点,很好的解释是@pt314在问题的可接受答案中SSH 如何在 if 条件下工作?以下是非关键部分:
主要问题是双引号字符串被本地 shell 扩展了......
但这可能只是问题的一部分。所以在继续之前,让我们先说几句最典型的方法nohup
的我们可以在互联网上找到的用法:
nohup comand -options arguments >/path/to/log 2>&1 &
| | | | # run 'nohup' in the background
| | | # redirect stderror to stdout
| | # redirect stdout of 'nohup', /dev/null when don't need it
| # the command to be executed, its stdout/err will be appended to the nohop's stdout
# run the following command detached from the current shell
根据上述内容,您似乎需要这样的命令:
ssh user@host 'nohup remote_command -optins arguments &' >/tmp/local.log
但是,这里究竟发生了什么?
的 stdout(标准输出)nohup
附加到 ssh 会话,ssh
命令的输出重定向到当前 shell 会话中的文件。换句话说,远程命令附加到本地 shell 会话。因此,如果我们在链上(ssh 会话或本地 shell)终止某些操作,一切都会失败。显然,在这种情况下,我们nohup
根本不需要远程会话。
如果我们更进一步,我们可以得出结论,nohup
在本地使用是一个好主意:
nohup ssh user@host 'remote_command -optins arguments' >/tmp/local.log 2>&1 &
这看起来很健壮,但是远程命令的执行仍然依赖于从本地计算机发起的 ssh 会话,因此,例如,如果重新启动,一切都将再次失败。
我认为有很多方法可以更安全地实现您的目标。以下是一条建议。
1.让我们nohup
使用规范方式 执行远程命令:
ssh user@host 'nohup remote_command -optins arguments >/tmp/remote.log 2>&1 &'
2.通过ssh获取远程日志并在后台写入本地日志:
nohup ssh user@host 'tail -n+1 -F /tmp/remote.log' >/tmp/local.log 2>&1 &
3.通过以下方式监视本地日志文件:
tail -F /tmp/local.log