如何退出PuTTY时不终止正在运行的PowerShell进程
问题原因
退出PuTTY结束SSH会话时,系统会向会话关联的所有子进程发送SIGHUP挂断信号,默认会终止前台/后台运行的未脱离会话的进程,你的PowerShell进程就是被这个信号终止的。
解决方案
你可以根据使用场景选择以下任意一种方案:
方案1:临时后台运行(适合快速测试)
用nohup命令让进程忽略SIGHUP信号,后台运行即可,命令格式如下,替换成你自己的脚本路径和日志路径:
nohup pwsh /path/to/your/bot/script.ps1 > /path/to/logfile.log 2>&1 &
参数说明:
nohup:让进程忽略挂断信号pwsh:Linux平台PowerShell的默认执行命令> /path/to/logfile.log 2>&1:把脚本的标准输出和错误输出都写入指定日志文件,方便后续排查问题- 末尾的
&:让进程直接在后台运行
执行完命令后输入exit正常退出SSH即可,不要直接关闭PuTTY窗口,避免部分环境下nohup不生效。
方案2:会话持久化工具(适合需要随时回到进程交互界面的场景)
可以用screen或者tmux这类终端复用工具保留会话,以tmux为例:
- 先安装tmux:Debian/Ubuntu系执行
apt install tmux,RHEL/CentOS系执行yum install tmux - 执行
tmux new -s discord-bot创建一个名为discord-bot的独立会话 - 在新开的会话里正常启动你的PowerShell机器人脚本
- 按
Ctrl+B之后再按D,即可脱离当前会话,此时进程会保持后台运行 - 后续需要回到会话操作的话,执行
tmux attach -t discord-bot即可恢复界面
即使退出PuTTY,tmux的会话也不会被终止,进程会持续运行。
方案3:系统服务注册(最稳定,适合生产环境长期运行)
直接把机器人注册成systemd服务,不仅可以保持后台运行,还支持开机自启、崩溃自动重启,操作步骤如下:
- 新建服务配置文件:
vi /etc/systemd/system/discord-bot.service - 写入以下配置,替换成你自己的实际路径和运行用户即可:
[Unit] Description=Discord Bot PowerShell Service After=network.target [Service] User=运行机器人的普通用户名(不建议用root) WorkingDirectory=/path/to/your/bot/脚本所在目录 ExecStart=/usr/bin/pwsh /path/to/your/bot/script.ps1 Restart=always RestartSec=5 # 部分环境PowerShell运行需要以下环境变量,无异常可以删掉 Environment=DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 [Install] WantedBy=multi-user.target
- 重载systemd配置:
systemctl daemon-reload - 启动服务:
systemctl start discord-bot - 设置开机自启:
systemctl enable discord-bot
后续要查看运行日志的话,执行journalctl -u discord-bot -f即可实时查看脚本输出。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

