Programa rodar em egundo plano

12 respostas
M

Bom dia !!!
pessoal estou com um problema que é o seguinte, preciso que um programa rode em segundo plano no linux em modo texto, bom o progama é um socket server, ele esta funcionando ok mas agora que quero implementar nas maqs ele não pode rodar em primeiro plano , ja tentei extender a classe de thread e usar o setDaemon(true) , porém ele continua rodando em primeiro plano, sem liberar o cursos para o usuario prosseguir, segue ai meu codigo

import java.net.*;

public class Server extends Thread
{
        private ServerSocket s;
        private Socket client;
        private Connection c;

        public Server()
                //cria socket
        {
        		setDaemon(true);
      			
                try
                {
                        s=new ServerSocket(5155);
                }
                catch (java.io.IOException e)
				{
                        System.out.println(e);
                        System.exit(1);
                }
                System.out.println("servidor escutando");
                try
                {
                        while (true)
                        {
                        		client = s.accept();
                                c = new Connection(client);
                                c.start();
                               
                        }
                }
                catch (java.io.IOException e)
                {
                        System.out.println(e);
                }
        }

        public static void main(String args[])
        {
                new Server();

        }

}

12 Respostas

L

Aqui nomeu trabalho temos alguns programas rodando em Linux mas no modo gráfico. ok

O que eu vejo por aqui é que eles fazem o programa rodar como um serviço.

Abs.

Leandro.

M

é isso que eu quero !!! tem como vc por aki um exemplo ? preciso que o processo rode como um serviço, so que não necessariamente em modo grafico !!!

vlw!!!

M

olha so eu consegui fazer ele rodar em segundo plano mas ele mata o processo quando eu falo que ele é daemon!!
da uma olhada !!

public class Serverinit {

	public static void main(String[] args) {
	Thread thread = new Server();
    	thread.setDaemon(true);
    	thread.start();	
	}

}
import java.net.*;

public class Server extends Thread
{
        private ServerSocket s;
        private Socket client;
        private Connection c;

        Server(){
        	//setDaemon(true);
        }
            
        public void run()
        {
        	
                try
                {
                        s=new ServerSocket(5155);
                }
                catch (java.io.IOException e)
				{
                        System.out.println(e);
                        System.exit(1);
                }
                System.out.println("servidor escutando");
                try
                {
                        while (true)
                        {
                        		client = s.accept();
                                c = new Connection(client);
                                c.start();
                               
                        }
                }
                catch (java.io.IOException e)
                {
                        System.out.println(e);
                }
        }
        
}
W

Sinceramente acho q vc não deve utilizar — thread.setDaemon(true); —
Apenas thread.start(), assim sua thread vai ficar rodando , a não ser q vc te trate para que ela tenha um “sleep” após um tempo determinado.

M

acho que o problema não esta na parte de
thread.setDaemon(true)

pq quando eu dou um sleep no programa que cria a thread a thread fica rodando mas quando o programa principal morre a thread morre junto 1!!!
estou precisando de uma forma de manter a thread viva depois que o programa qua a cria morre !!!

blz !!

W

Então é o seguinte, não sei exatamente como o seu programa roda, mas se rodar a partir de um webserver vc pode criar uma servlet que simplesmente chame sua classe que incia a thread.
Vai no web.xml da aplicação e implementa a servlet com a propriedade load-on-startup, assim :

<servlet>

<servlet-name>NOME DA SERVLET</servlet-name>

<servlet-class>PACOTE DA SERVLET.NOME DA SERVLET</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

Criei uma aplicação que roda em backgound paralelamente a uma outra aplicação web, funciona basicamente assim para iniciar minha thread.
Espero que ajude !!!

M

eu não rodo com servlet não , na verdade nem sei fazer com servlet…
é apenas um socket que tem que ficar rodando para que eu acesse a maq atraves dele e execute alguns comandos, ele esta funcionando mas apenas em primeiro plano !!! :frowning:

valew mas ainda não consegui !!!

A

Use isso. Eu testei e deu certo.

public String execComando&#40;String asComando&#41;&#123; 
      String retorno=new String&#40;""&#41;; 
      try&#123; 
         Runtime rt = Runtime.getRuntime&#40;&#41;; 
         Process prcs = rt.exec&#40;asComando&#41;; //Executa o comando no shell ou DOS 
         InputStreamReader isr = new InputStreamReader&#40;prcs.getInputStream&#40;&#41;&#41;; 
         BufferedReader br = new BufferedReader&#40;isr&#41;; 
         String line; 
         //Le a resposta do comando linha por linha. 
         while &#40;&#40;line = br.readLine&#40;&#41;&#41; != null&#41; 
            retorno += line + "\n"; 
     &#125;catch&#40;IOException ioe&#41;&#123; 
        System.out.println&#40;ioe.getMessage&#40;&#41;&#41;; 
     &#125; 
     return retorno; 
     &#125; 
&#125;
M

tudo bem mas ele tambem roda em primeiro plano

eu Preciso de uma forma de FAZER O PROCESSO RODAR EM SEGUNDO PLANO, e continue assim , mesmo que a classe que o chamou tenha morrido !!!

A

??? Eu testei fazendo com que essa aplicação X, rodasse uma outra aplicação Y e dps finalizei a aplicação X. Mesmo assim a aplicação Y não foi finalizada.
Se vc prestar a atenção nesse código, vc vai ver que ele cria um novo processo, independente do processo invocador.

Vc chegou a testar isso na sua aplicação?

M

valeu pela ajuda ai !!! realmente funcionou !!! eu criei um programa para chamar meu programa java ai ele fica em segundo plano !! :slight_smile:

valew
fui !!

A

Cara,
tava dando uma olhada aqui!
Pra vc rodar pelo linux, sem ser pelo java, é só colocar “&” no final da linha de comando, que ele roda em background!
Mas se vc quizer conferir o resultado gerado é só usar nohup!

nohup ./Comando &amp;

Ele gera um numero pra vc que é o PID do prodrocesso!
Ai quando acabar de rodar ele gera um arquivo nohup.out, que é um texto com o resultado do console!
Sei que vc ja resolveu via JAVA, mais via LINUX é assim!
FLoW!!!

Criado 11 de agosto de 2005
Ultima resposta 16 de ago. de 2005
Respostas 12
Participantes 5