我想在服务器计算机的后台运行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
答案 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
重新连接到会话。