nohup可屏蔽SIGHUP信号使Python服务后台持久运行;需用exit退出终端,配合重定向日志或/dev/null,并通过ps、tail和kill管理进程。

你在Mac终端里启动了一个Python服务或数据库,刚关掉窗口就发现进程没了——这是因为终端退出时会向所有子进程发送SIGHUP信号,默认导致程序终止。nohup能屏蔽这个信号,让程序真正脱离终端控制继续运行。
基础用法:nohup + 命令 + &
第一步:在终端中输入 nohup python app.py &,回车执行。
这一步会立即返回提示,例如 nohup: ignoring input and appending output to 'nohup.out',说明命令已提交后台。
第二步:按回车键一次,确保光标回到新行,再输入 exit 退出终端。
【必须用 exit 命令退出,不能直接点关闭按钮】 直接关闭窗口会导致当前 shell session 强制终止,nohup 启动的进程仍会被连带通知退出,等同于没用 nohup。
自定义日志输出路径
默认情况下,所有 stdout 和 stderr 都会追加写入当前目录的 nohup.out。如果当前目录不可写(比如系统目录或只读挂载点),日志会自动 fallback 到 $HOME/nohup.out,但你可能根本找不到它。
方法一:重定向到指定文件
nohup python server.py > server.log 2>&1 &
这里 > server.log 把标准输出写入 server.log,2>&1 把标准错误也合并进去,避免日志分散。
方法二:彻底丢弃输出(适合静默守护进程)
nohup python cleanup.py > /dev/null 2>&1 &
注意:/dev/null 是黑洞设备,写入即消失,但进程本身不受影响。
验证进程是否真正在后台存活
① 打开一个新终端窗口,执行:
ps aux | grep "python app.py"
如果看到对应进程,并且 PPID(父进程ID)是 1,说明它已被 init/systemd 接管,已完全脱离原终端。
② 查看日志实时输出:
tail -f nohup.out 或 tail -f server.log
③ 如果想停止该进程:
先用 ps aux | grep app.py 找到 PID,再执行 kill PID。

















