vagrant ssh -c以及在连接关闭后保持后台进程运行的问题

6
我正在编写一个脚本,以在vagrant机器内启动和后台执行进程。似乎每次脚本和ssh会话结束时,后台进程也会结束。
这是我运行的命令: vagrant ssh -c "cd /vagrant/src; nohup python hello.py > hello.out > 2>&1 &" hello.py实际上只是一个flask开发服务器。如果我交互式登录并手动运行nohup命令,关闭会话后,服务器将继续运行。然而,如果我通过vagrant ssh -c运行它,就好像该命令根本没有运行(即没有创建hello.out文件)。运行方式有何区别,如何解决问题使其正常工作?

说句实话,我也曾经为此苦恼。然而,虽然这不是你问题的直接答案,但我发现JetBrains Webstorm可以解决我的问题。它与Vagrant集成,并允许我设置在Vagrant box中运行Bash或Nodejs的运行配置。这些运行配置可以在WebStorm中停止和启动。太棒了。 - skinneejoe
2个回答

13

当我尝试将Django应用程序作为守护进程运行时,我遇到了同样的问题。我不知道为什么,在后面添加"sleep 1"对我有用。

vagrant ssh -c "nohup python manage.py runserver & sleep 1"

1
我尝试了大量的解决方案,包括精心设计的标准输出和标准错误重定向以及提供/dev/null作为输入。这是我找到的唯一一个真正有效的解决方案。 - bto
@SandyChapman 我刚发现这个。不过,有什么替代方案吗? - OneCricketeer
1
@cricket_007 通常当你加入一个神奇的等待时,这并不是理想的。它会导致代码质量差,容易在不同系统上运行时出现故障。在这种情况下,也许最好的替代方法是在 tmux 会话中运行?我不确定,需要尝试一些其他方法。 - Sandy Chapman
在我的情况下,使用pipenv:vagrant ssh -c“pipenv run nohup python ./manage.py run_long_backup --my-arg&sleep 1;”。看起来解决了问题。我可以使用vagrant ssh; tail -f nohup.out来观察命令的输出。 - inostia

2

当我运行wireshark时,使用ssh命令内部的nohup并不能正常工作,但是以下方法可以:

nohup vagrant ssh -c "wireshark" &

我完全不理解这个,但这对我也起作用了。实际上,我运行了 vagrant ssh -c "sudo -u otheruser -i some-script.sh",但无法使其持续运行。但是在我的一侧使用 nohup 就可以了。你有什么想法为什么会这样? - virgo47
最终我使用 --no-tty 选项在 vagrant ssh 中,得到了与没有使用 nohup 相同的结果。 - virgo47

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接