Python ApacheHTTPD没有加载.bashrc

Python ApacheHTTPD没有加载.bashrc,python,bash,cgi,apache,Python,Bash,Cgi,Apache,我在Apache2.2下以CGI的形式运行Python脚本。这些脚本依赖于my.bashrc中设置的环境变量来正常运行。.bashrc从未加载,我的脚本也失败了 我不想使用一堆SETENV命令来复制我的bashrc;配置文件很容易失去同步,并导致难以发现的错误 我以用户身份运行apache,而不是以root用户身份。我正在手动启动/停止它,所以我认为/etc/init.d脚本根本不重要 考虑到这些约束条件,在调用CGI时,如何加载.bashrc 编辑:我使用/usr/sbin/apache2ct

我在Apache2.2下以CGI的形式运行Python脚本。这些脚本依赖于my.bashrc中设置的环境变量来正常运行。.bashrc从未加载,我的脚本也失败了

我不想使用一堆SETENV命令来复制我的bashrc;配置文件很容易失去同步,并导致难以发现的错误

我以用户身份运行apache,而不是以root用户身份。我正在手动启动/停止它,所以我认为/etc/init.d脚本根本不重要

考虑到这些约束条件,在调用CGI时,如何加载.bashrc


编辑:我使用/usr/sbin/apache2ctl重新启动。

什么?当然,您的意思不是说您的脚本依赖于某些帐户的个人主目录中的配置

Apache配置文件可以将环境变量导出到CGI脚本等


也许您的程序太依赖于太多的环境变量。支持配置文件:/etc/mypythonprogram.rc怎么样。为了灵活性,可以有一个环境变量告诉程序使用另一个配置文件。

什么?当然,您的意思不是说您的脚本依赖于某些帐户的个人主目录中的配置

Apache配置文件可以将环境变量导出到CGI脚本等


也许您的程序太依赖于太多的环境变量。支持配置文件:/etc/mypythonprogram.rc怎么样。为了灵活性,可以有一个环境变量告诉程序使用另一个配置文件。

为什么要手动启动/停止它?使用init脚本似乎会有所帮助。您可以在httpd.conf文件中指定运行httpd进程的用户名,还可以指定环境设置。对于RedHat/CentOs,这看起来像:

将环境设置添加到文件/etc/sysconfig/httpd中。或者,您可以设置一个命令从另一个文件中读取这些环境变量,如果需要,还可以在.bashrc中设置相同的命令-因此只有一个文件包含您需要的环境设置

修改/etc/httpd/conf/httpd.conf文件,使运行httpd进程的用户在默认情况下是非root用户,它应该是RedHat/CentOs中的apache

完成后,使用/etc/init.d/httpd启动和停止该过程,您应该处于良好状态

根据海报评论更新:

你不想从你的bashrc上读。。。使用/usr/init.d/httpd重新启动它就像apache2ctl一样简单。。。至于如何做到这一点,请将环境变量放入一个新文件中。在下面的示例中,我假设您正在使用文件/etc/httpd/envconfig。然后将这些行添加到bashrc和/etc/sysconfig/httpd中:

如果[-f/etc/httpd/envconfig];然后 . /etc/httpd/envconfig fi

现在,bash和httpd脚本都应该使用更新的环境变量运行

另一个注意事项是,在Apache中,CGI环境变量的处理方式不同,您可能希望查看以下URL:

特别是,…变量也可以从使用PassEnv指令启动服务器的shell环境中传递


我相信您需要在httpd.conf文件中放入适当的PassEnv指令,指定希望传递给CGI脚本的环境变量的名称。好消息是,您不必指定值,因此只要不更改变量本身的名称,就不必管理两种配置。

为什么要手动启动/停止它?使用init脚本似乎会有所帮助。您可以在httpd.conf文件中指定运行httpd进程的用户名,还可以指定环境设置。对于RedHat/CentOs,这看起来像:

将环境设置添加到文件/etc/sysconfig/httpd中。或者,您可以设置一个命令从另一个文件中读取这些环境变量,如果需要,还可以在.bashrc中设置相同的命令-因此只有一个文件包含您需要的环境设置

修改/etc/httpd/conf/httpd.conf文件,使运行httpd进程的用户在默认情况下是非root用户,它应该是RedHat/CentOs中的apache

完成后,使用/etc/init.d/httpd启动和停止该过程,您应该处于良好状态

根据海报评论更新:

你不想从你的bashrc上读。。。使用/usr/init.d/httpd重新启动它就像apache2ctl一样简单。。。至于如何做到这一点,请将环境变量放入一个新文件中。在下面的示例中,我假设您正在使用文件/etc/httpd/envconfig。然后将这些行添加到bashrc和/etc/sysconfig/httpd中:

如果[-f/etc/httpd/envconfig];然后 . /etc/httpd/envconfig fi

现在两个哟 您的bash和httpd脚本应该使用更新的环境变量运行

另一个注意事项是,在Apache中,CGI环境变量的处理方式不同,您可能希望查看以下URL:

特别是,…变量也可以从使用PassEnv指令启动服务器的shell环境中传递


我相信您需要在httpd.conf文件中放入适当的PassEnv指令,指定希望传递给CGI脚本的环境变量的名称。好消息是,您不必指定值,因此只要不更改变量本身的名称,就不必管理两种配置。

说明或链接可能会有所帮助。这是后者:它被标记为php,但我认为这一原则是适用的。不过,这是OP说他不想做的。也许可以用一个解释来减轻他的恐惧?@Kaz:我有一大堆脚本,通常是从命令行使用的,我正在为其中一些脚本制作一个私有的web界面。这些命令行工具依赖于环境变量-这是不可协商的。@Wilduck:实际上,这个链接很有帮助。PassEnv是一个不错的解决方案,但并不理想。环境变量集不会经常更改,尽管它们的值会经常更改。告诉Apache使用来自外部环境的任何值至少可以避免在我更改值时出现问题,尽管在添加新参数时不会出现问题。说明或链接可能会有所帮助。这是后者:它被标记为php,但我认为这一原则是适用的。不过,这是OP说他不想做的。也许可以用一个解释来减轻他的恐惧?@Kaz:我有一大堆脚本,通常是从命令行使用的,我正在为其中一些脚本制作一个私有的web界面。这些命令行工具依赖于环境变量-这是不可协商的。@Wilduck:实际上,这个链接很有帮助。PassEnv是一个不错的解决方案,但并不理想。环境变量集不会经常更改,尽管它们的值会经常更改。告诉Apache使用来自外部环境的任何值至少可以避免在我更改值时出现问题,尽管在添加新参数时不会出现问题。我正在手动启动/停止它,因为我正在调试它:。每次更改httpd.conf时,我都会重新启动它,使用/usr/sbin/apache2ctl。设置一个命令,从另一个文件中读取这些环境变量——实际上我已经有了另一个文件,并且我从.bashrc中读取了它。如何执行此操作?我正在手动启动/停止它,因为我正在调试它:。每次更改httpd.conf时,我都会重新启动它,使用/usr/sbin/apache2ctl。设置一个命令,从另一个文件中读取这些环境变量——实际上我已经有了另一个文件,并且我从.bashrc中读取了它。我该怎么做?