通过SSH在远程计算机上运行jar时未创建日志

时间:2018-05-02 06:42:34

标签: java spring-boot logging ssh

假设以下设置:

  • MachineA:userA @
  • MachineB:userB @

我想在机器B上运行我的JAR:

当我这样跑的时候:
java -jar myApplication.jar > /dev/null 2>&1 & 一切顺利,我的jar文件旁边会生成日志。

当我从机器A通过ssh运行时:
ssh userB@<ipB> "java -jar myApplication.jar > /dev/null 2>&1 &"

应用程序在计算机B上启动,但没有生成日志文件。

顺便说一句,jar是一个常规的spring启动应用程序,使用logback进行日志记录。

2 个答案:

答案 0 :(得分:1)

您的应用程序甚至在有机会创建日志文件之前就被杀死了。如果从命令中删除最终的&符号,它可能会起作用:

gcloud container clusters create "gke-test-cluster" --image-type=UBUNTU --machine-type=n1-standard-2  --zone us-east1-c --num-nodes 2 --cluster-version=1.8    
kubectl create -f https://k8s.io/docs/tasks/debug-application-cluster/shell-demo.yaml              
kubectl get pod shell-demo          

kubectl exec -it shell-demo -- /bin/bash  
Error from server: error dialing backend: No SSH tunnels currently open. Were the targets able to accept an ssh-key for user "gke-0c"?  

kubectl logs shell-demo  
Error from server: Get https://10.142.0.5:10250/containerLogs/default/shell-demo/nginx: No SSH tunnels currently open. Were the targets able to accept an ssh-key for user "gke-0c"?  

当存在&符号时,命令将被放入后台。由于ssh进程创建的shell没有前台作业,它会立即关闭连接。当连接关闭时,机器B将杀死所有命令的子进程,包括Java应用程序。

您还可以使用ssh userB@<ipB> "java -jar myApplication.jar > /dev/null 2>&1" 分离java进程,以便在nohup连接关闭时不会被杀死。这具有额外的好处,即使您的连接中断,应用程序也将继续运行:

ssh

您可能还会看到查看ssh userB@<ipB> "nohup java -jar myApplication.jar > /dev/null 2>&1 < /dev/null &" screen

答案 1 :(得分:1)

好的,应用程序正在运行并且正在生成日志,而不是我预期的位置。

在myApplication配置文件中,有一个属性
logging.file=logs/myApplication.log

当我通过SSH启动我的应用程序时,执行的文件夹是/home/userB而不是/home/userB/deployment/build
因此,日志不是在应用程序所在的同一文件夹中生成的,而是在userB的主文件夹中生成的。

在启动应用程序之前,修复程序是cd到特定文件夹。