即使使用nohup,后台shell脚本也无法在ssh注销后到达目录

时间:2015-12-16 12:44:52

标签: linux bash shell

我想在服务器计算机的后台运行shell脚本,并从ssh连接启动该shell脚本。即使我使用def load_ec2_instances(region): """ Load the EC2 instances a region :param region: :rtype: list :return: a list of the instances in a region or None if there are no instances """ ec2 = _get_resource("ec2", region) ec2_instances = ec2.instances.all() counter = collections.Counter(ec2_instances); ec2_size = sum(counter.itervalues()); if ec2_size == 0: return None return ec2_instances def get_environments_from_instances(instances): """ Get all the environments available from instances lists :param list instances: the list of instance :rtype: list :return: a list of the environments """ environments = [] for instance in instances: tags = instance.tags for tag in tags: key = tag.get("Key") if key == "Environment": environment = tag.get("Value").strip() if environment not in environments: environments.append(environment) return environments 运行后台进程脚本,,只要我关闭ssh连接,后台脚本就会因目录无法访问错误而失败(并且没有越快)。

runInBackground.sh

nohup

run.sh

#!/bin/bash
...
nohup ./run.sh > /dev/null 2> local/errorLog.txt < /dev/null &

因此,当我运行#!/bin/bash ... while [ true ] ; do ... cd optaplanner-examples mvn exec:exec // calls java process cd .. done 时,一切都运行好几个小时,直到我断开我的ssh连接。 一旦我退出,runInBackground.sh就会填满:

errorlog.txt

Full source code

3 个答案:

答案 0 :(得分:6)

嗯,它不一定是加密的主目录,但它可能是一个自动挂载的主目录(例如,通过NFS等)。它在会话启动时挂载,并在退出时卸载。加密的家庭目录只是使用这种技术的可能原因之一。

主要问题是确定用户是否需要主目录的规则是什么。我希望它可以是一个分配的pty。你可以通过启动一个没有伪终端的非交互式SSH会话来测试它是否真实:ssh -T user@host ls /home/myUser/server。我可以预期,在这种情况下,您将无法获得正确的目录列表。

然后我会使用像screen这样的程序来延长超出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会话。

答案 1 :(得分:1)

我总是使用屏幕实用程序来运行我的脚本而不是nohup。

使用 screen ,即使您当前的ssh会话超时或断开连接,您的流程也会继续运行。

使用如下 -

apt-get install screen (On Debian based Systems)

OR

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>

希望这很有用。

答案 2 :(得分:0)

一种解决方法是使用screen来保持ssh会话打开。如果断开连接,可以使用screen -r重新连接到会话。