如何在使用runit时设置Python路径

1 投票
1 回答
1535 浏览
提问于 2025-04-17 14:35

我在Ubuntu 12.04上使用runit来管理一个进程。当我运行时,日志中出现了下面的错误:

sv up test/

我猜这可能是Python路径的问题。

ImportError: No module named htcommon.ht_redis
Traceback (most recent call last):
  File "/home/ubuntu/workspace/htFrontEnd/htanalytics/ht_rpc_server.py", line 17, in <module>
    from htpData import HTPItemBase, HTPUserBase
  File "/home/ubuntu/workspace/htFrontEnd/htanalytics/htpData.py", line 9, in <module>
    from htcommon.ht_redis import HTRedisConnection
ImportError: No module named htcommon.ht_redis]

我已经在/etc/environment中设置了路径,也在.bashrc中进行了设置。

下面是我的runit脚本。

#!/bin/sh
exec 2>&1
exec export PYTHONPATH=$PYTHONPATH:/home/ubuntu/workspace/htFrontEnd/heythat
exec export PYTHONPATH=$PYTHONPATH:/home/ubuntu/workspace/htFrontEnd/heythat/htanalytics
exec /usr/bin/python /home/ubuntu/workspace/htFrontEnd/htanalytics/ht_rpc_server.py >> /tmp/ht_rpc_server.log 2>&1
root@aws-rpc-server-east-staging-20130203070552:/etc/sv# 

当我从命令行运行这个进程时,没有任何问题,它可以正常工作。

/usr/bin/python /home/ubuntu/workspace/htFrontEnd/heythat/htanalytics/ht_rpc_server.py

为什么runit不工作呢?为什么它找不到路径?

1 个回答

4

这个脚本看起来有几个潜在的问题。我觉得'export'是不能用'exec'来执行的。至少在我用的bourne版本中是这样。'exec'命令会把当前的进程(也就是你的脚本)替换成被调用的命令,除非被调用的命令失败,否则不会返回。所以,把'export'用'exec'来执行是没有意义的。另外,这些命令可以合并成一行。所以,你的脚本应该更像这样:

#!/bin/sh
export PYTHONPATH=$PYTHONPATH:/home/ubuntu/workspace/htFrontEnd/heythat:/home/ubuntu/workspace/htFrontEnd/heythat/htanalytics
exec /usr/bin/python /home/ubuntu/workspace/htFrontEnd/htanalytics/ht_rpc_server.py >> /tmp/ht_rpc_server.log 2>&1

撰写回答