假设以下设置:
我想在机器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进行日志记录。
答案 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
到特定文件夹。