Linux使用技巧

Linux使用技巧
ExisfarLinux使用技巧
Linux: 后台运行进程
在 Linux 中,将当前进程放到后台运行并确保在关闭终端后仍持续运行,可以通过以下步骤实现:
方法 1:使用 nohup
+ &
(推荐)
-
启动时直接后台运行
在命令前加nohup
,末尾加&
:nohup your_command > output.log 2>&1 &
•
nohup
:忽略挂断信号(SIGHUP),防止终端关闭时进程被终止。
•> output.log
:将标准输出重定向到文件(默认会输出到nohup.out
)。
•2>&1
:将错误输出合并到标准输出。
•&
:让进程在后台运行。 -
查看后台进程
jobs -l # 查看当前终端的后台任务
ps aux | grep your_command # 全局查找进程 -
关闭终端后仍运行
进程会脱离当前终端,由init
进程(PID=1)接管,即使关闭终端也不会终止。
方法 2:使用 disown
(针对已运行的进程)
如果进程已在前台运行:
- 按
Ctrl + Z
暂停进程。 - 输入
bg
将其转为后台运行。 - 使用
disown
移除进程与终端的关联:此时关闭终端不会影响进程。disown -h %1 # %1 是作业编号(通过 `jobs` 查看)
方法 3:使用 screen
或 tmux
(会话管理)
- 创建持久会话
screen -S session_name # 新建会话
tmux new -s session_name - 在会话中运行命令
直接执行你的命令(无需nohup
或&
)。 - 分离会话
按Ctrl + A + D
(screen)或Ctrl + B + D
(tmux)分离会话。 - 关闭终端后重新连接会话中的进程会持续运行。
screen -r session_name # 恢复会话
tmux attach -t session_name
方法 4:使用 systemd
(系统级服务,适合长期运行)
- 创建服务文件(如
/etc/systemd/system/your_service.service
):[Unit]
Description=Your Service
[Service]
ExecStart=/path/to/your_command
Restart=always
User=your_username
[Install]
WantedBy=multi-user.target - 启用并启动服务:进程会作为守护进程运行,不受终端影响。
sudo systemctl enable your_service
sudo systemctl start your_service
关键区别
方法 | 适用场景 | 是否需要提前准备 | 终端关闭后效果 |
---|---|---|---|
nohup |
简单临时任务 | 否 | 持续运行 |
disown |
已运行的前台任务 | 否 | 持续运行 |
screen |
交互式或需要恢复的进程 | 需安装 | 会话持久化 |
systemd |
长期后台服务 | 需配置 | 系统级守护进程 |
验证进程是否存活
关闭终端后,通过以下命令检查:
ps aux | grep your_command # 查看进程是否存在 |
选择最适合你场景的方法即可!
检查进程是否退出
你的 python main.py
进程(PID 1611
)确实在运行,但它的状态是 Rl
(运行中,多线程),并且 CPU 占用很高(205%
,说明是多核运行)。
为什么 Ctrl+Z
+ bg
后关闭终端,进程仍然存活?
通常 Ctrl+Z
+ bg
后直接关闭终端会导致进程被终止,但你的情况可能有以下几种原因:
- 进程已经脱离终端(可能是
nohup
、disown
或screen
启动的)。 - Shell 配置特殊(如
huponexit
被关闭)。 - 进程自己处理了
SIGHUP
(某些 Python 程序会忽略终端挂断信号)。
如何确认进程是否会随终端关闭而终止?
1. 检查进程的父进程(PPID)
pstree -p | grep 1611 |
• 如果父进程是 init
(PID=1)或 systemd
,说明它已经脱离终端,关闭终端不会影响它。
• 如果父进程是你的 Shell(如 bash
,PID=xxxx),关闭终端后它会被终止。
2. 检查进程是否被 nohup
启动
ps -fp 1611 |
• 如果 COMMAND
列显示 nohup python main.py
,说明它受 nohup
保护。
3. 检查 huponexit
设置
shopt | grep huponexit |
• 如果输出 huponexit off
,说明 Shell 不会在退出时发送 SIGHUP
(你的进程可能因此存活)。
如何确保进程在关闭终端后继续运行?
方法 1:用 disown
移除关联(如果还在当前 Shell 中)
jobs -l # 查看作业号(如 %1) |
然后可以安全关闭终端。
方法 2:用 screen
/ tmux
托管(推荐)
screen -S my_python_session |
即使关闭终端,进程仍在 screen
会话中运行,后续可恢复:
screen -r my_python_session |
方法 3:用 nohup
重新启动
nohup python main.py > output.log 2>&1 & |
这样即使关闭终端,进程也会继续运行。
总结
• 你的 python main.py
已经在运行,但不确定是否会受终端关闭影响。
• 用 pstree -p | grep 1611
检查父进程,确认是否脱离终端。
• 如果想确保安全,可以用 disown
、screen
或 nohup
管理。
如果仍有疑问,可以贴出 pstree -p 1611
或 ps -fp 1611
的输出,我可以帮你进一步分析!