在使用 SSH 远程连接服务器时,我们常希望在断开连接后仍然让程序继续运行,以下是几种常见的方法:
1. 使用 screen 或 tmux
screen 和 tmux 是两款非常强大的终端复用工具,它们允许你在后台运行会话,即使断开 SSH 连接,程序也会继续运行。
screen
安装 screen
sudo apt-get install screen # Ubuntu/Debian
sudo yum install screen # CentOS
sudo pacman -S screen # Arch
例如创建一个名为 mysession 的会话
screen -S mysession
在 screen 会话中启动程序,例如
python myscript.py
断开当前会话:
按下 Ctrl+A,然后按 D 键,这将把会话放到后台。
重新连接到会话:
screen -r mysession
tmux
安装 tmux
sudo apt-get install tmux # Ubuntu/Debian
sudo yum install tmux # CentOS
sudo pacman -S tmux # Arch Linux
启动 tmux 会话
tmux new -s mysession
断开当前会话:
按下 Ctrl
+B
然后按 D
键,这将把会话放到后台。
重新连接到会话
tmux attach -t mysession
2.使用 nohup
运行程序
nohup python myscript.py &
这将把程序放到后台运行,并将输出重定向到 nohup.out
文件。
查看输出:
cat nohup.out
3.使用 disown
如果你已经启动了一个程序,但忘记使用 screen
或 nohup
,可以使用 disown
命令。
启动程序
python myscript.py
将程序放到后台:
按下 Ctrl
+Z
,然后运行 bg
bg
使用 disown
disown
这将使程序在后台运行,并且不会被终止。
4.使用 systemd
或 supervisord
systemd
是 Linux 系统的初始化系统,supervisord
是一个用 Python 编写的进程控制工具
systemd
创建服务文件:
在 /etc/systemd/system/
目录下创建一个服务文件,例如 myscript.service
:
[Unit]
Description=My Script Service
[Service]
ExecStart=/usr/bin/python /path/to/myscript.py
Restart=always
[Install]
WantedBy=multi-user.target
启动服务
sudo systemctl start myscript
设置开机启动
sudo systemctl enable myscript
supervisord
安装 supervisord:
sudo apt-get install supervisor
配置程序:
在 /etc/supervisor/conf.d/
目录下创建一个配置文件,例如 myscript.conf
:
[program:myscript]
command=/usr/bin/python /path/to/myscript.py
autostart=true
autorestart=true
stdout_logfile=/var/log/myscript.log
stderr_logfile=/var/log/myscript.err
更新配置并启动:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start myscript
总结
• 如果需要简单地让程序在后台运行,推荐使用 screen 或 tmux
• 如果只是临时需要让程序继续运行,可以使用 nohup
或 disown
• 如果需要更复杂的程序管理,可以使用 systemd
或 supervisord