Fazendo processos rodarem em background
Publicado por Bruno Gola 25/10/2006
[ Hits: 12.491 ]
Este script serve como exemplo de como criar um programa que execute uma determinada função em background, ou seja, funcione como um daemon.
Neste exemplo ele roda um servidor que fica esperando por conexões remotas via socket.
#!/usr/bin/python
# -*- coding: iso8859-1 -*-
"""
Este script serve para como podemos criar um processo que execute em background usando a syscall fork, que cria um processo identico ao que esta sendo executado, ou seja faz uma cópia do processo que chamou fork, o processo criado é o famoso processo filho. fork retorna o PID do filho para o processo que o chamou (processo pai) e 0 para o que acabou de criar (filho), para que assim você saiba se esta trabalhando com o pai ou o filho.
Este exemplo cria um servidor simples que aguarda uma conexão e recebe mensagens vindas de um cliente, as mensagens são gravadas no arquivo passado como argumento.
Exemplo:
$ ./background.py arquivo.log 9099
Processo executado em background, PID = 2825
Para ter ajuda basta digitar ./background.py -h
Bruno Gola < brunogola em gmail ponto com >
"""
""" Módulo necessário para utilização de sockets"""
from socket import *
""" Módulos para receber argumentos via linha de comando e sair do programa (exit) """
from sys import argv,exit
""" Módulo para criar processos filhos (syscall fork())"""
from os import fork
def server():
""" Esta função abre um servidor que fica esperando por conexões de rede na porta definida. """
NUMERO_CONEXOES = 1 # Número de conexões que o server aceitara
if len(argv) < 3:
usage()
exit(1)
sock = socket(AF_INET,SOCK_STREAM) # Criação do socket do servidor
sock.bind(("localhost",int(argv[2]))) # Faz o socket escutar no ip "localhost" e porta passado no argumento
sock.listen(NUMERO_CONEXOES) # Escuta até NUMERO_CONEXOES conexões
client = sock.accept() # Aceita e espera por conexões
new_sock = client[0] # client[0] contém o socket para a conexão aberta,
ip = client[1][0] # client[1] contém uma tupla com informações sobre o client no formato (ip,porta)
file.write("Cliente conectado.\nInformações:\n\tIP: %s\n" % ip)
file.flush()
file.write("\nO Server está de pé, esperando por mensagens. \n\n")
file.flush()
BY = 1024
try:
msg = ""
while msg != "{FONTE}":
msg = new_sock.recv(BY) # Recebe uma mensagem pelo socket aberto, recebe até BY bytes
file.write("Mensagem recebida de %s -> %s\n" % (ip,msg))
file.flush()
file.write("Cliente %s desconectado.\nFechando o servidor." % ip)
file.flush()
except KeyboardInterrupt: # Trata o CTRL+C
file.close()
print "Saindo..."
exit(0)
def usage():
print "Uso: %s options [arquivo log] [porta]\n\n\t-h mostra esta mensagem de ajuda." % argv[0]
if __name__ == "__main__":
args = ("-h")
if len(argv) < 2 or argv[1] == "-h":
usage()
exit(1)
try:
file = open(argv[1],'w')
except:
print "Sem permissão de escrita no arquivo %s" % argv[1]
exit(1)
pid = fork() # cria uma cópia do processo (cria o filho), retorna 0 para o filho e o PID do filho para o pai
if pid: # se pid != 0, ou seja, se pid, isso significa que estamos com o pai e "pid" contém o pid do filho
print "Processo executado em background, PID = %d" % pid
exit(0)# o pai envia a mensagem para o usuário e sai, ja o filho que não passou pelo if anterior continua a execução
server() # O filho executa o servidor, ja em background.
exit(0)
Mighty Are's Tool of Easily Promote Combats
Conversor de dólares em reais e vice-versa
Simples script para atrasar/adiantar legendas
Nenhum comentário foi encontrado.
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Programa fora de escala na tela do pc (13)
Fedora KDE plasma 42 X Módulo de segurança BB (Warsaw-2) (1)
O programa assinador digital (1)









