如何在Linux中配置SSH连接断开后进程不退 Linux使用nohup的方法
nohup 经常失效的根本原因是它只忽略 SIGHUP,不解决进程归属与 TTY 依赖问题;需同时满足显式重定向、强制后台、规避 TTY 依赖三条件才可靠。
nohup ./script.sh & 为什么经常失效
根本原因不是 nohup 失效,而是它只负责忽略 SIGHUP,不解决进程归属问题。Shell 在退出时会清理自己的作业表(job table),如果进程仍登记在其中,即使忽略信号,某些程序(如含 read、sudo 或交互式逻辑的脚本)会因失去控制终端而主动退出。
常见连带问题包括:
-
nohup.out所在目录不可写(比如当前路径权限不足),nohup直接失败并返回125或126 - 脚本里用了相对路径读写文件,但
nohup不切换工作目录(cwd),实际操作的是启动时的路径,容易出错 - 漏掉末尾的
&,导致命令前台阻塞,SSH 断开前就卡住 -
nohup./script.sh中缺少空格,被解析为一个命令名,报command not found
真正可靠的 nohup 写法
必须同时满足三个条件:显式重定向输出、强制后台、规避 TTY 依赖。缺一不可。
推荐写法:
nohup ./script.sh > ./output.log 2>&1 &
说明:
-
> ./output.log:绕过默认的nohup.out,避免权限/路径不确定性 -
2>&1:把 stderr 合并进 stdout,日志统一,排查方便 - 末尾的
&:确保脱离前台控制,否则nohup会等待脚本退出(尤其当脚本不自动结束时)
如果脚本依赖特定目录,请先 cd /path/to/script && nohup ./script.sh > output.log 2>&1 &,不能靠脚本内部 cd 补救。
遇到 nohup 不行时,该换什么
当脚本内调用 ssh、rsync -P、scp 等需要伪终端的命令,或需随时查看实时进度,nohup 就力不从心了。
更稳的选择:
-
tmux new-session -d -s mytask 'command':启动分离式会话,之后可用tmux attach -t mytask重新进入 -
setsid ./script.sh &:让进程直接以init(PID 1)为父进程,彻底脱离会话期,不受 shell 生命周期影响 -
./script.sh & disown %1:适合已启动但忘记加nohup的场景,补救快 - 长期服务类任务(如 Web 后端、定时采集),别硬扛
nohup:改用systemd --user或supervisord,它们管重启、日志轮转、资源限制
最容易被忽略的细节
很多人以为加了 nohup 就万事大吉,其实最关键的控制点藏在路径和上下文里:
-
nohup不改变当前工作目录(cwd),所有相对路径都按启动位置解析 —— 和你在脚本里写cd是两回事 - 脚本中若调用
sudo,默认拒绝非 TTY 环境,得加-n参数或配置Defaults !requiretty -
nohup.out或自定义日志文件如果磁盘满、inode 耗尽、或挂载为只读,nohup会静默失败或退出 - 用
ps aux | grep script.sh查进程时,注意区分是真运行还是残留的 grep 进程
真正稳住一个远程进程,靠的不是单条命令,而是对路径、权限、TTY、信号链路的完整掌控。
如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!
猜您喜欢
育碧加速《全境封锁3》开发进程 大规模招聘核心岗位
2026-06-05尽管育碧当前正面临诸多挑战,但公司未来的产品线依然令人期待,包括《刺客信条:黑旗记忆重置》《雷曼:传奇重制版》等作品均已提上日程。与此同时,育碧旗下另一款备受关注的IP——《全境封锁》系列的最新续作,似乎也迎来了开发提速的信号。 据Tech4Gamers报道,育碧近日发布了7个专门针对《全境封锁3》的新职位招聘信息,涉及多个核心开发岗位,包括:首席游戏设计师、高级AI游戏设计师、动画总监以及其他关...
如何在Python中通过pytest-forked实现在独立的进程中运行每个用例?
2026-06-04pytest-forked不支持单个用例独立进程,因其fork发生在模块级而非用例级,仅对整个测试文件生效;真正实现per-test-case进程隔离需使用pytest-xdist的--boxed模式。 直接用pytest-forked无法让「每个测试用例」都在独立进程中运行——它只支持「每个测试文件」或「每个测试会话」级的fork,不支持per-test-case粒度。 为什么pytest-fo...
如何修复 Win11 更新导致的 Wi-Fi 频繁断开连接
2026-06-04Windows11更新后Wi-Fi频繁断连的五大解决方法:1.启动WLANAutoConfig服务;2.禁用再启用无线适配器;3.重置TCP/IP与Winsock协议栈并重启;4.忘记并重新添加Wi-Fi网络;5.执行系统级网络重置。 Windows11更新后Wi-Fi频繁断开,连接状态反复闪烁、显示“已连接,无Internet”或需手动重连才能恢复,问题通常由更新覆盖网络服务、重置驱动状态、禁用...
如何利用Python concurrent.futures统一管理线程池与进程池性能?
2026-06-02ThreadPoolExecutor适合I/O密集型任务,如网络请求、文件读写、数据库查询,因线程等待时会释放GIL;ProcessPoolExecutor才适用于CPU密集型任务,因其绕过GIL实现真正并行。 选对执行器比调参重要得多——ThreadPoolExecutor和ProcessPoolExecutor的性能差异主要来自任务类型,不是max_workers数值本身。 ThreadPoo...
如何解决Python多进程共享大字典时的内存拷贝问题?
2026-06-02直接用dict传给子进程会导致内存翻倍,因fork后的写时复制被Python内部操作(如引用计数、哈希查找)意外触发;共享只读字典应使用shared_memory+序列化,配合显式清理。 直接用dict传给子进程,内存几乎必然翻倍——不是因为你要改它,而是Python解释器自己就在偷偷写它。 为什么fork后大字典会触发写时复制? Linux/macOS上fork()默认启用写时复制(CoW),但...
如何解决Mac连接iPhone热点总是断开 Mac增强热点连接稳定性的方法
2026-05-29Mac连接iPhone热点频繁断开是因iOS与macOS在电源管理、频段协商、协议配置及服务交互中存在链路稳定性失配,需从iPhone端优化热点运行状态、Mac端调整Wi-Fi与电源策略、禁用IPv6、启用USB直连、修改热点名称与加密方式五方面系统解决。 如果您使用Mac设备连接iPhone个人热点时频繁断开,这通常不是网络故障,而是由iOS与macOS在电源管理、频段协商、协议配置及系统服务交...
如何在Python中模拟多进程间的通信测试_使用multiprocessing.Pipe
2026-05-29multiprocessing.Pipe默认为全双工,但若未明确区分读写端并同步关闭写端,主线程recv会因无数据而永久阻塞;需用duplex=False明确分工、加timeout、子进程结束前close写端以触发EOFError。 为什么multiprocessing.Pipe不能直接在主线程里recv而不send? 因为Pipe默认创建的是**半双工连接**(除非显式传duplex=True)...
Linux下如何查看某个文件的被哪些进程占用 fuser用法【教程】
2026-05-29fuser不适合查单个文件,因其按inode或挂载点聚合扫描,对普通文件识别率低;它真正擅长的是目录、挂载点和端口排查,查文件应优先用lsof。 fuser不能直接查“某个文件”被谁占用——它查的是路径,且对普通文件支持弱;真要查单个文件,优先用lsof-t或lsof-p配合grep,fuser更适合目录、挂载点、端口。 为什么fuser查单个文件经常没输出或报错 fuser的设计目标是快速定位“...
如何在Linux中查看某个进程的启动时间 Linux获取进程运行时长的方法
2026-05-29最准的进程启动时间用ps-olstart=-pPID,因其输出完整稳定时间戳;运行时长唯一可靠字段是etime,表示自启动以来的整秒数。 直接看ps-olstart=-pPID,这是最准、最省事的启动时间获取方式;需要运行时长就用etime,别碰time或STIME——它们根本不是一回事。 为什么优先用lstart字段而不是stime或STIME lstart输出完整时间戳(如WedMay2107...
Python项目中多进程消费同一个RabbitMQ队列怎么保障数据一致性?
2026-05-29RabbitMQ本身保证单条消息只投递一次给一个消费者,数据一致性问题源于业务逻辑并发执行导致的竞态,而非消息重复投递;basic_ack仅确认消息接收,不保障业务执行唯一性,故无法解决数据一致性问题。 多进程消费同一个RabbitMQ队列时,数据一致性问题不来自RabbitMQ本身(它天然保证单条消息只投递一次给一个消费者),而来自业务逻辑并发执行导致的竞态——比如多个进程同时读写同一张数据库表...
