nohup能否在系统完全关机或sudo重启后持续运行?及替代方案咨询
首先直接给你答案:不行。nohup只能帮你解决「关闭终端后进程不终止」的问题,但系统完全关机或者重启时,所有运行中的进程都会被内核终止——不管你用不用nohup。
为什么nohup做不到?
nohup的核心作用是让进程忽略SIGHUP信号(当你关闭终端时,终端会给关联的进程发送这个信号触发退出),同时默认把标准输出/错误重定向到nohup.out文件。但它没有能力让进程在系统重启后“复活”——系统重启时内核会终止所有进程,重启完成后不会自动重新启动这些进程。
适合你的替代方案(针对Ubuntu 16.04)
下面推荐几个能让脚本在系统重启后自动运行的方案,按推荐程度排序:
方案一:用systemd创建开机自启服务(最稳定,推荐)
Ubuntu 16.04已经默认使用systemd作为系统服务管理器,它不仅能让脚本开机自启,还能在进程意外崩溃时自动重启,管理起来非常方便。步骤如下:- 创建一个服务配置文件,比如
/etc/systemd/system/nationalbiblioteket.service,填入以下内容(注意替换所有/绝对路径为你实际的文件路径):[Unit] Description=Nationalbiblioteket日志处理服务 After=network.target # 如果脚本需要网络连接,保留这一行;不需要可以删掉 [Service] User=root # 你用管理员身份运行,所以指定root用户 ExecStart=/usr/bin/python -u /脚本的绝对路径/nationalbiblioteket_logs.py --query 0 WorkingDirectory=/脚本所在目录的绝对路径 Restart=always # 进程意外退出时自动重启 RestartSec=5 # 重启间隔5秒 StandardOutput=append:/日志文件的绝对路径/log_q0.out # 输出追加到指定日志 StandardError=inherit # 错误输出和标准输出合并到同一个文件 [Install] WantedBy=multi-user.target - 保存文件后,刷新systemd的配置:
sudo systemctl daemon-reload - 设置开机自启并立即启动服务:
sudo systemctl enable nationalbiblioteket.service sudo systemctl start nationalbiblioteket.service
之后你可以用
sudo systemctl status nationalbiblioteket.service查看服务运行状态,用journalctl -u nationalbiblioteket.service查看详细日志。- 创建一个服务配置文件,比如
方案二:用cron的@reboot任务(简单快捷)
如果你的需求只是开机自动运行脚本,不需要监控进程崩溃重启的功能,cron是个更轻量的选择:- 编辑root用户的crontab(因为你用管理员身份运行):
sudo crontab -e - 在文件末尾添加一行(所有路径必须用绝对路径,因为cron的环境变量和用户终端不同):
@reboot nohup /usr/bin/python -u /脚本的绝对路径/nationalbiblioteket_logs.py --query 0 > /日志文件的绝对路径/log_q0.out 2>&1 & - 保存退出即可。下次系统重启时,脚本会自动以root身份运行。
- 编辑root用户的crontab(因为你用管理员身份运行):
方案三:使用Supervisor(适合多进程管理)
如果你需要同时管理多个类似的长期运行脚本,Supervisor是个不错的选择,它能自动重启崩溃的进程,管理起来更灵活:- 先安装Supervisor:
sudo apt-get update && sudo apt-get install supervisor - 创建配置文件
/etc/supervisor/conf.d/nationalbiblioteket.conf,内容如下:[program:nationalbiblioteket] command=/usr/bin/python -u /脚本的绝对路径/nationalbiblioteket_logs.py --query 0 directory=/脚本所在目录的绝对路径 user=root stdout_logfile=/日志文件的绝对路径/log_q0.out stdout_logfile_maxbytes=10MB # 日志文件最大10MB,满了会自动切割 stderr_logfile=/日志文件的绝对路径/log_q0.err # 单独保存错误日志 stderr_logfile_maxbytes=10MB autorestart=true # 进程崩溃时自动重启 - 重新加载配置并启动进程:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start nationalbiblioteket
你可以用
sudo supervisorctl status查看所有进程状态,用supervisorctl tail nationalbiblioteket实时查看日志。- 先安装Supervisor:
备注:内容来源于stack exchange,提问作者farid

