O problema pode ser o modo como o Apache inicia os subprocessos. Eles podem ser gerados por bifurcação e permitir que os processos clonados do Apache se tornem outros processos. Cada clone herda todas as alças de arquivo abertas do processo pai, incluindo o identificador aberto da porta TCP 80.
O Netstat mostra apenas um aplicativo associado ao identificador de arquivo aberto, enquanto três processos mantêm o identificador aberto.
Possíveis soluções para o seu problema:
-
Se for importante manter os subprocessos em execução durante uma reinicialização do Apache, a solução mais simples seria iniciar os 3 Processos como serviços de sistema separados.
-
Se eles dependem de um Apache em execução, um comando 'apache stop' também deve finalizá-los. Isso pode ser feito editando o script /etc/init.d/apache.
-
Se você for forçado a iniciá-los a partir do Apache, será necessário iniciá-los como "processos daemon" reais!
Eu escrevi um criador de daemon para um aplicativo PyQt inspirado no link . Você poderia iniciar este script a partir do Apache, chamar exec_as_daemon para cada um dos seus subprocessos e fechá-lo.
# Copyright: (c) 2011 phobie <[email protected]>
# License: CC-by-sa 3.0
import os
def exec_as_daemon(s_path_cmd, l_args=[]):
i_pid = os.fork()
if i_pid != 0:
# Always remember to gobble your zombie children
os.wait()
# Back to parent
return
# Detach from parent
os.setsid()
# Do not block any mounts
os.chdir('/')
# Reset file creation rights
os.umask(0)
i_pid = os.fork()
if i_pid != 0:
# Close the direct child process
os._exit(0)
# Get the maximum count of open file handles
try:
import resource
i_fd_max = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
if i_fd_max == resource.RLIM_INFINITY:
i_fd_max = 1024
except ImportError:
i_fd_max = 1024
# Try to close all possible file handles
for i_cur_fd in range(0, i_fd_max):
try:
os.close(i_cur_fd)
except OSError:
pass
# Assosiate STDIN with /dev/null
os.open(os.devnull if hasattr(os, "devnull") else '/dev/null', os.O_RDWR)
# STDOUT to /dev/null
os.dup2(0, 1)
# STDERR to /dev/null
os.dup2(0, 2)
l_args.insert(0, s_path_cmd)
# Let the clone become a other process
os.execv(s_path_cmd, l_args)
if __name__ == '__main__':
exec_as_daemon('/usr/bin/java', ['-jar', '/usr/local/bin/apache_helper_daemon.jar'])
exec_as_daemon('/usr/local/bin/apache_helper_daemon.py')