在CentOS中创建Phoenix Shell后台进程及命名管道后台运行问题
我来针对你的两个CentOS环境下的Phoenix Shell问题分别给出实用的解决方案:
Phoenix Shell的核心是sqlline.py脚本,要让它在后台稳定运行,有几种不同场景的方案可选:
持久化后台运行(终端关闭也不终止):用
nohup搭配后台符号&,同时重定向输出到日志文件方便排查问题:nohup python sqlline.py > phoenix_run.log 2>&1 &这里
2>&1是把错误输出和标准输出合并到同一个日志文件,nohup会帮你忽略终端挂起信号,确保进程不会随终端退出而终止。需要后续交互的后台会话:如果之后还要重新连接到Phoenix Shell操作,推荐用
screen或tmux:- 先安装screen:
sudo yum install screen -y - 新建一个专属会话:
screen -S phoenix_session - 在会话里正常启动
python sqlline.py - 按
Ctrl+A再按D就能脱离会话,进程会在后台继续跑 - 之后要回来操作的话,执行
screen -r phoenix_session就能重新连接
- 先安装screen:
简单后台运行(无需交互):如果不需要和Shell交互,直接把标准输入重定向到
/dev/null,避免进程因为等待输入而挂起:python sqlline.py < /dev/null &
fg的问题 你遇到的问题本质是命名管道的读取端进程会阻塞,直到有写入端向管道输入数据。当你单独把python sqlline.py < yourfifo &放到后台时,进程会卡在等待输入的状态,直到你执行fg让它回到前台,终端的输入流触发了状态变化,但这显然不是理想的后台运行方式。
这里有几个更靠谱的解决办法:
方法1:子shell包裹同时启动读写操作
把创建管道、写入、读取的操作放到同一个子shell里后台运行,确保写入端和读取端同时启动,避免阻塞:
(makefifo yourfifo && cat "a.sql" > yourfifo & python sqlline.py < yourfifo) &
这样子shell后台执行时,两个进程会同时触发,读取端不会一直空等。
方法2:用nohup实现持久化后台
如果需要进程不受终端关闭影响,分开用nohup启动读写操作:
# 创建命名管道 makefifo yourfifo # 后台写入SQL文件到管道 nohup cat "a.sql" > yourfifo & # 后台启动Phoenix Shell读取管道,并重定向日志 nohup python sqlline.py < yourfifo > phoenix_sql.log 2>&1 &
进程结束后记得删掉管道文件:rm yourfifo,不然会留下空的管道文件。
方法3:用进程替换替代命名管道(更简洁)
其实完全不需要创建命名管道,用bash的进程替换直接把SQL文件的内容作为sqlline.py的输入,避免所有阻塞问题:
python sqlline.py < <(cat "a.sql") &
这种方式会自动创建匿名管道,执行完后也不用清理文件,非常省心。
内容的提问来源于stack exchange,提问作者Anwesh Mohapatra

