如何通过SSH连接Azure VM并在本地机关闭后让程序永久运行?
Azure VM后台持久运行爬取程序的解决方案
现有方案失效原因排查
你之前用的nohup和screen本身是支持脱离SSH会话运行的,失效大概率是操作不规范导致的:
- 运行nohup时需要按标准格式执行,且正常退出SSH:
正确命令格式为nohup 你的程序启动命令 > run.log 2>&1 &,执行完成后必须输入exit主动退出SSH会话,不要直接关闭终端窗口,否则终端会向会话内所有进程发送SIGHUP信号,可能导致进程被终止。 - 使用screen时需要走detach流程:
程序启动后按Ctrl+A+D快捷键将会话放到后台运行,不要直接在screen内输入exit退出,否则进程会随screen会话一同销毁。
更稳定的实现方案(推荐)
方案1:systemd系统服务(最优,支持开机自启、异常自动重启)
完全脱离用户会话生命周期管理,是Linux后台常驻进程的标准实现方式,配置步骤如下:
- 新建服务配置文件,执行命令:
sudo vim /etc/systemd/system/data-crawler.service - 写入如下配置(替换尖括号内的内容为你自己的实际路径):
[Unit] Description=10 minutes interval data crawler After=network.target [Service] User=<你的VM登录用户名> WorkingDirectory=<你的爬虫程序所在的文件夹绝对路径> ExecStart=<你的程序启动命令的绝对路径,比如/usr/bin/python3 /home/xxx/crawler.py> Restart=always RestartSec=3 [Install] WantedBy=multi-user.target
- 依次执行命令启动服务并设置开机自启:
- 重载systemd配置:
sudo systemctl daemon-reload - 启动服务:
sudo systemctl start data-crawler.service - 开启开机自启:
sudo systemctl enable data-crawler.service - 查看服务运行状态:
sudo systemctl status data-crawler.service - 查看程序运行日志:
journalctl -u data-crawler.service -f
方案2:Crontab定时任务(适合单次执行的爬取逻辑)
如果你的程序不需要常驻内存,每次执行完爬取就可以退出,可以不用自己写while循环,直接用系统定时任务调度,配置步骤:
- 执行命令编辑当前用户的定时任务:
crontab -e - 在文件末尾添加一行(替换尖括号内容):
*/10 * * * * <你的程序启动命令绝对路径> >> <你要保存日志的路径,比如/home/xxx/crawler.log> 2>&1
保存退出后就会自动生效,每10分钟执行一次你的爬取程序。
方案3:Azure原生无服务方案(可选,省成本)
如果你不想长期保持VM运行,可以使用Azure Functions定时触发器,配置每10分钟触发一次爬取逻辑,无需维护服务器,按调用次数计费,成本更低。
内容的提问来源于stack exchange,提问作者ivantheterrabad
相关产品推荐
相关产品推荐

