答案是使用&、nohup、screen/tmux和systemd四种方法。首先&符号可将程序放入后台运行,但终端关闭时进程会终止;其次nohup命令能忽略SIGHUP信号,确保进程在终端关闭后继续运行,并重定向输出到文件;接着screen或tmux提供虚拟终端会话,支持分离与重新连接,适合需要交互的长期任务;最后systemd通过.service文件管理开机自启、自动重启和日志记录,适用于生产环境服务的系统级管理。

在Linux系统里,让程序在后台持续运行,不被终端关闭影响,是日常工作里一个很基础但又特别重要的技能。简单来说,我们主要通过几种方式来实现:最直接的是使用
&
nohup
screen
tmux
systemd
我在日常工作中,处理后台进程的需求场景通常有这么几种:偶尔跑个脚本,不希望它霸占我的终端;需要长时间运行一个程序,即使我断开SSH连接它也要继续;或者,干脆就是把一个应用部署成一个服务,让系统开机自启并自动管理。针对这些不同场景,我的选择也不同。
1. 临时后台运行:&
这是最简单粗暴的方式。当你执行一个命令时,在末尾加上一个
&
./my_script.sh &
这种方式的优点是快捷,适合那些你确定很快会完成,或者即使中断了也没关系的任务。但它有个致命缺点:这个进程仍然是当前终端会话的子进程。一旦你关闭终端,或者SSH连接断开,这个进程通常会收到SIGHUP信号(挂断信号),然后随之终止。我刚开始接触Linux的时候,就吃过这个亏,以为加个
&
2. 防止终端关闭:nohup
为了解决
&
nohup
nohup
nohup
nohup.out
nohup ./my_long_running_process.py > output.log 2>&1 &
这里,
> output.log
output.log
2>&1
output.log
&
nohup
screen
systemd
3. 会话管理与进程持久化:screen
tmux
当我的需求是“我需要在一个虚拟终端里运行多个命令,并且随时可以断开连接,下次再连上来继续操作”时,
screen
tmux
# screen screen -S my_session # 创建一个名为my_session的会话 # 在新会话中执行你的命令,例如: # python my_app.py # 按 Ctrl+A D 分离会话 screen -ls # 查看所有会话 screen -r my_session # 重新附加到my_session # tmux tmux new -s my_session # 创建一个名为my_session的会话 # 在新会话中执行你的命令 # 按 Ctrl+B D 分离会话 tmux ls # 查看所有会话 tmux attach -t my_session # 重新附加到my_session
我个人更偏爱
tmux
4. 系统级服务管理:systemd
对于那些需要开机自启、持续运行、并且需要系统级别管理(例如自动重启、资源限制等)的应用程序,
systemd
.service
你需要创建一个
.service
/etc/systemd/system/
# /etc/systemd/system/my_app.service [Unit] Description=My Custom Application Service After=network.target [Service] User=your_user WorkingDirectory=/path/to/your/app ExecStart=/usr/bin/python3 /path/to/your/app/main.py Restart=always RestartSec=3 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
然后,通过
systemctl
sudo systemctl enable my_app.service # 设置开机自启 sudo systemctl start my_app.service # 启动服务 sudo systemctl status my_app.service # 查看服务状态 sudo systemctl stop my_app.service # 停止服务 sudo systemctl restart my_app.service # 重启服务
我发现,一旦一个应用需要长期稳定运行,并且可能需要团队其他成员维护时,把它做成
systemd
这个问题几乎是每个初学者都会遇到的“坑”。你明明把一个程序扔到后台跑了,结果过了一段时间回来一看,它却悄无声息地挂掉了。这背后主要有几个原因,而理解它们对于我们选择正确的后台运行策略至关重要。
最常见的原因是SIGHUP信号。当你的终端会话结束(比如你关闭了SSH客户端,或者直接关闭了终端窗口),操作系统会向该会话下的所有子进程发送一个SIGHUP(Hang Up)信号。默认情况下,收到SIGHUP信号的进程会终止。这就是为什么你用
&
nohup
另一个不那么常见但同样致命的原因是资源限制或程序自身的错误。你的程序可能因为内存溢出、CPU占用过高被系统杀死(OOM Killer),或者它在运行过程中遇到了未捕获的异常导致崩溃。这跟后台运行的技巧本身关系不大,但却是后台进程意外终止的常见因素。当遇到这种情况时,我通常会去查看程序的日志文件(如果用
nohup
nohup.out
systemd
journalctl -u your_service
还有一种情况,是父进程的退出。在某些复杂的进程树结构中,如果一个程序的父进程意外终止,那么它的子进程也可能随之被终止,这取决于进程组和会话的机制。不过,对于我们通常的后台运行场景,只要解决了SIGHUP信号的问题,并确保程序自身稳定,这种情况就比较少见了。理解这些“幕后杀手”,能帮助我们更好地选择工具,比如
nohup
screen
tmux
systemd
这个问题的核心在于,你希望让程序在服务器上继续跑,但你又不想让它霸占你当前的终端窗口,并且你可能还想在未来的某个时候重新“连接”到这个程序的运行环境,查看它的输出或者进行交互。这时候,
screen
tmux
当你使用
screen
tmux
下次当你需要查看程序的运行状态,或者想继续与它交互时,你只需要重新SSH登录到服务器,然后“附加”(attach)回之前的那个虚拟会话。你会发现一切都保持原样,仿佛你从未离开过。这种感觉就像你把电脑屏幕关掉了,但电脑本身还在运行,等你再打开屏幕,所有窗口和程序都还在那里。
screen
screen -S my_long_task
-S
python my_script.py
Ctrl+A
D
[detached from ...]
screen -ls
screen -r my_long_task
screen -r
screen -X -S my_long_task quit
tmux
tmux new -s my_long_task
Ctrl+B
D
[detached (from session ...)]
tmux ls
tmux attach -t my_long_task
tmux kill-session -t my_long_task
我个人在使用这些工具时,会习惯性地给每个重要的任务创建一个独立的会话,并起一个有意义的名字。这样,即使服务器上跑着好几个后台任务,我也能清晰地知道哪个会话对应哪个任务,管理起来井井有条。它们极大地提升了我在远程服务器上工作的效率和舒适度,避免了因为网络不稳定或者不小心关闭终端而导致工作中断的烦恼。
对于那些需要长期稳定运行,甚至要求系统开机自启,并且能够被系统统一监控和管理的应用程序,仅仅依靠
nohup
screen
tmux
systemd
systemd
.service
.service
为什么选择systemd
systemctl enable
systemd
Restart=always
systemctl
User=
Group=
systemd
systemd
journalctl -u your_service_name
创建一个systemd
编写.service
/etc/systemd/system/
my_web_app.service
[Unit]
After=network.target
[Service]
User=your_user
WorkingDirectory=/path/to/your/app
ExecStart=/usr/bin/python3 /path/to/your/app/main.py
Restart=always
RestartSec=3
StandardOutput=journal
StandardError=journal
[Install]
systemctl enable
WantedBy=multi-user.target
重新加载systemd
sudo systemctl daemon-reload
.service
systemd
启用并启动服务:
sudo systemctl enable my_web_app.service
sudo systemctl start my_web_app.service
查看服务状态和日志:
sudo systemctl status my_web_app.service
sudo journalctl -u my_web_app.service -f
我个人在部署生产环境应用时,几乎都会把它们封装成
systemd
systemctl status
journalctl
systemctl stop/start/restart
以上就是Linux后台运行进程的常用技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号