我想在服务器计算机的后台运行一个shell脚本,并从ssh连接启动该shell脚本.即使我运行后台进程脚本nohup
,后台脚本在我关闭ssh连接时(并且不久)就会因目录无法访问错误而失败.
runInBackground.sh:
#!/bin/bash ... nohup ./run.sh > /dev/null 2> local/errorLog.txt < /dev/null &
run.sh:
#!/bin/bash ... while [ true ] ; do ... cd optaplanner-examples mvn exec:exec // calls java process cd .. done
因此,当我运行时runInBackground.sh
,一切都运行好几个小时,直到我断开我的ssh连接.一旦我退出,errorlog.txt
填满:
java.io.FileNotFoundException: /home/myUser/server/optaplanner-simple-benchmark-daemon/local/output/ ./run.sh: line 64: /home/myUser/server/optaplanner-simple-benchmark-daemon/local/processed/failed_machineReassignmentBenchmarkConfig.xml: No such file or directory fatal: Could not change back to '(unreachable)/server/optaplanner-simple-benchmark-daemon/local/optaplannerGitClone/optaplanner': No such file or directory ls: cannot access /home/myUser/server/optaplanner-simple-benchmark-daemon/local/input: No such file or directory ls: cannot access /home/myUser/server/optaplanner-simple-benchmark-daemon/local/input: No such file or directory ls: cannot access /home/myUser/server/optaplanner-simple-benchmark-daemon/local/input: No such file or directory ... // 1000+ more of that ls error
(完整源代码)
好吧,它不一定是加密的主目录,但它可能是一个自动挂载的主目录(例如通过NFS等).它在会话启动时挂载,并在退出时卸载.加密的家庭目录只是使用这种技术的可能原因之一.
主要问题是决定用户是否需要家庭目录的规则是什么.我希望它可能是一个分配的pty.您可以通过启动非交互式SSH会话w/oa伪终端来测试它是否真实:ssh -T user@host ls /home/myUser/server
.我可以预期,在这种情况下,您将无法获得正确的目录列表.
然后我会使用像屏幕这样的程序来延长超出SSH会话限制的交互式会话生命周期.
服务器可能会使用其他一些机制来为交互式SSH会话提供主目录.例如监视utmp中列出的交互式会话在这种情况下,您将需要一个程序,只要您需要服务就可以保留记录.也许您可以使用自动重新建立的SSH会话.例如,我使用以下systemd单元自动保留来自不同专用网络中的一个工作站的ssh隧道:
[Unit] Description=A tunnel to SOME_HOST PartOf=sshd.service Requires=network.service [Service] ExecStart=/usr/bin/ssh -N -q -R 2222:localhost:22 SOME_HOST Restart=on-failure RestartSec=5 User=tunnel Group=tunnel [Install] WantedBy=sshd.service WantedBy=network.service
发生故障时,systemd会自动重启设备并重新建立SSH会话.