在 CentOS 服务器上运行 Python 脚本时,如果因为某些原因(如数据库连接阻塞)导致进程未能正确终止,可能会留下残留的进程。这些残留的进程会占用系统资源,甚至可能干扰后续脚本的执行。以下是一些解决此问题的建议:
ps
和 kill
命令手动清理残留进程首先,你可以使用 ps
命令查找正在运行的 Python 进程,然后手动终止它们。
在 test.py
中添加错误处理和清理代码,确保在发生异常时能够正确关闭数据库连接和其他资源。
import sys
import signal
import psycopg2 # 假设你使用的是 PostgreSQL 数据库
# 设置一个信号处理函数,以便在接收到终止信号时执行清理操作
def signal_handler(sig, frame):
print('You pressed Ctrl+C!')
try:
# 尝试关闭数据库连接(如果有的话)
if conn:
conn.close()
except Exception as e:
print(f"Error closing connection: {e}")
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
# 数据库连接代码
conn = None
try:
conn = psycopg2.connect("dbname=test user=postgres password=secret")
# 你的数据库操作代码
except Exception as e:
print(f"Database error: {e}")
finally:
if conn:
conn.close()
tmux
或 screen
管理会话使用 tmux
或 screen
这样的终端复用器,可以更容易地管理长时间运行的进程。你可以随时断开连接并重新连接,而不会中断正在运行的进程。
安装 tmux:
sudo yum install tmux
启动一个新的 tmux 会话:
tmux new -s my_session
在 tmux 会话中运行脚本:
python3 test.py test2 ...
分离 tmux 会话:
按下 Ctrl+b
然后按 d
来分离会话。
重新连接 tmux 会话:
tmux attach -t my_session
nohup
或 &
后台运行脚本使用 nohup
或将脚本放在后台运行,即使你关闭终端,脚本也会继续运行。
使用 nohup
:
nohup python3 test.py test2 ... &
直接后台运行:
python3 test.py test2 ... &
timeout
命令限制脚本运行时间你可以使用 timeout
命令来限制脚本的最长运行时间,如果超时则自动终止。
timeout 600 python3 test.py test2 ...
这将使脚本最多运行 600 秒(10 分钟),然后自动终止。
根据你的具体需求,可以选择以上一种或多种方法来避免和解决 Python 脚本的残留进程问题。确保在脚本中添加适当的错误处理和资源清理代码,是防止此类问题的关键。