💡 为什么关掉电脑后命令会中断?
当我们用 ssh 登录服务器时,远程命令实际上依附在当前 SSH 会话 上。
如果关闭电脑、断开连接或退出终端,所有在当前会话中运行的进程(除非被特别"脱离")都会被系统回收。
例如:
ssh ubuntu@myserver
docker compose pull
一旦你关闭笔记本或断网,docker compose pull 就会被终止。
✅ 目标:让任务"独立运行"
我们希望命令即使在你:
-
关闭本地电脑
-
断开 SSH
-
甚至重启服务器后
依然能够自动或持续执行。
Ubuntu 提供了三种成熟的方式来实现这一点。
🧩 方案一:
nohup ------ 最简后台执行
1️⃣ 基本用法
nohup your_command > output.log 2>&1 &
例如:
cd /var/www/supabase-sk-auth
nohup docker compose pull > pull.log 2>&1 &
2️⃣ 参数说明
参数 | 含义 |
---|---|
nohup | 忽略挂起信号(HUP),防止断开 SSH 时进程被杀死 |
> output.log | 把输出写入文件 |
2>&1 | 把错误输出重定向到同一文件 |
& | 后台运行,不阻塞终端 |
3️⃣ 管理命令
查看任务:
ps aux | grep docker
查看日志:
tail -f pull.log
停止任务:
kill <PID>
✅ 优点:极其简单
⚠️ 缺点:不支持交互,无法重新进入查看实时输出
🧩 方案二:
tmux ------ 可恢复的终端会话(推荐)
1️⃣ 安装
sudo apt install tmux -y
2️⃣ 创建会话并执行命令
tmux new -s dockerpull
cd /var/www/supabase-sk-auth
docker compose pull
此时,你可以按下:
Ctrl + B, 然后 D
即可"分离"会话。任务仍在后台运行。
3️⃣ 重新连接
tmux attach -t dockerpull
查看所有会话:
tmux ls
删除会话:
tmux kill-session -t dockerpull
✅ 优点:
-
即使关机、断网也不会中断
-
可重新连接、查看实时输出
-
适合长期执行的命令或脚本
⚠️ 缺点:
- 需要手动进入会话(比 nohup 多一步)
🧩 方案三:
systemd ------ 永久守护进程(自动启动)
如果你想让命令在系统重启后也自动执行,可以创建一个自定义服务。
1️⃣ 新建服务文件
sudo nano /etc/systemd/system/dockerpull.service
2️⃣ 写入配置
[Unit]
Description=Pull Docker images automatically
After=network.target
[Service]
ExecStart=/usr/bin/docker compose -f /var/www/supabase-sk-auth/docker-compose.yml pull
WorkingDirectory=/var/www/supabase-sk-auth
StandardOutput=append:/var/www/supabase-sk-auth/pull.log
StandardError=append:/var/www/supabase-sk-auth/pull.log
Restart=always
[Install]
WantedBy=multi-user.target
3️⃣ 启动并启用服务
sudo systemctl daemon-reload
sudo systemctl enable --now dockerpull.service
从此:
-
系统启动时会自动执行
-
日志写入 pull.log
-
若失败会自动重启
🧭 三种方法对比
场景 | 推荐方法 | 是否可断线继续 | 是否可重启继续 | 适合任务类型 |
---|---|---|---|---|
一次性命令 | nohup | ✅ | ❌ | 拉取镜像、短脚本 |
可交互、可恢复任务 | tmux | ✅ | ❌ | 构建、训练、爬虫 |
永久守护进程 | systemd | ✅ | ✅ | 后台服务、长期任务 |
🧰 附:可直接复用的脚本模板
如果你经常要执行同类任务,可以创建一个小脚本:
#!/bin/bash
cd /var/www/supabase-sk-auth
tmux new -d -s dockerpull "docker compose pull && docker compose up -d"
保存为 run-docker-pull.sh,赋予执行权限:
chmod +x run-docker-pull.sh
然后只需:
./run-docker-pull.sh
就会自动在后台 tmux 会话中执行。
🏁 总结
当你关闭电脑后,只要服务器仍在运行:
-
nohup 是最轻量的后台执行方式;
-
tmux 是最灵活的交互式解决方案;
-
systemd 是最稳定的自动化守护方案。
如果你经常在服务器上执行构建、部署、Docker 等任务,
推荐使用 tmux + 脚本封装,既安全又可控。
✍️ 作者的话
很多人误以为"关掉自己电脑,任务就会停"。
其实,只要命令运行在远程服务器上,它独立于你的电脑存在。
关键是让进程 不依赖于当前 SSH 会话------这正是本文介绍的三种方案的核心原理。