Python没有正确地重启linux进程

时间:2012-12-31 08:36:17

标签: php python linux process

我有一个PHP项目,我使用Python在生产服务器上部署它。

以下是部署计划:

  1. 找到新的php.ini文件(已定义路径)

  2. 用此文件替换当前文件

  3. 通过os.system('service php-fastcgi restart')重启PHP-FPM流程,其中php-fastcgi是流程的真实名称。

  4. Python在执行脚本期间不会显示任何错误,但PHP会使用默认配置重新启动。当我尝试手动重启(在Linux终端中)时,它可以正常工作,并且新的php.ini配置成功加载。你能解释一下我的Python脚本的奇怪行为吗?

    更新

    这是Python脚本的一部分。

        php_ini_path_replace = '/etc/php5/cgi/php.ini'
        php_ini_path_source = os.path.join(destination, 'production', 'config', 'main-php.ini')
    
        try:        # Read source file
            source_conf_file = open(php_ini_path_source, 'r')
            php_ini_lines = source_conf_file.readlines()
        except IOError:
            print('Something is wrong with source file')
    
        try:
            actual_conf_file = open(php_ini_path_replace, 'w')
            actual_conf_file.writelines( php_ini_lines )
            print('PHP CGI configuration was succesfully changed.\nDon\'t forget to restart the PHP')
        except IOError:
            print('Something is wrong with actual file. May be it\'s in use')
    
    os.system('service php-fastcgi restart')
    

3 个答案:

答案 0 :(得分:1)

writelines()写入的数据可能会保留在进程内缓存中,直到刷新文件为止(如C中所示)。之后启动的其他进程可能会看到空文件或部分文件。完成编写后,您需要添加source_conf_file.close()。 (这是一个令人讨厌的问题,因为当Python进程完成时,然后该文件被刷新并且如果你之后尝试查看它则显示正确。)

答案 1 :(得分:1)

使用copyfile代替手动打开和关闭文件。

import shutil

php_ini_path_replace = '/etc/php5/cgi/php.ini'
php_ini_path_source = os.path.join(destination, 'production', 'config', 'main-php.ini')

try:
    shutil.copyfile(php_ini_path_source, php_ini_path_replace)
except (Error,IOError):
    print('Error copying the file')

os.system('service php-fastcgi restart')

答案 2 :(得分:0)

我认为你应该更好地粘贴shell cmd中的返回码或字符串,它可以帮助我们找到根本原因。

有人建议:

请记得关闭文件处理程序。您可以使用with。像:

try:
    with open(php_ini_path_source, 'r') as source_conf_file:
        php_ini_lines = source_conf_file.readlines()
except IOError:
    print('Something is wrong with source file')