[英]Background shell script can't reach directories after ssh logout, even with nohup
我想在服务器计算机的后台运行一个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会话。
我总是使用屏幕实用程序来运行我的脚本而不是nohup。
使用屏幕 ,即使当前的ssh会话超时或断开连接,您的进程也会继续运行。
使用如下 -
apt-get install screen (On Debian based Systems)
要么
yum install screen (On RedHat based Systems)
运行应用程序并实时检查输出(假设您的脚本文件未启动后台进程并将其输出到stdout和/或stderr
cd your_app_directory_path
screen ./your_script.sh
完成后想要离开(不停止进程),使用CTRL + A + D分离屏幕。
要检查使用屏幕实用程序运行的进程 -
screen -r
重新连接正在运行的进程
screen -r <screen id or name>
希望这很有用。
一种解决方法是使用screen
来保持ssh会话打开。 如果断开连接,可以使用screen -r
重新连接到会话。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.