Autor Tópico: COMO FAZER? shellscript: pegar o PID de um programa executado  (Lida 8701 vezes)

Offline crixtiano

  • Usuário Ubuntu
  • *
  • Mensagens: 339
    • Ver perfil
COMO FAZER? shellscript: pegar o PID de um programa executado
« Online: 31 de Agosto de 2007, 19:10 »
Gente,

eu preciso desenvolver um script que faça isso:

1) execute um programa qualquer
2) pegue o pid desse programa que acabou de ser executado


Como fazer isso usando shellscript?

Obrigado

Cristiano


Offline Diego_Rocha

  • Usuário Ubuntu
  • *
  • Mensagens: 372
  • Slackware current
    • Ver perfil
Re: COMO FAZER? shellscript: pegar o PID de um programa executado
« Resposta #1 Online: 31 de Agosto de 2007, 19:25 »
ps aux | grep name_program
pidof programa

tem essas duas opções naum sei se tem outra mais viavel t++

Offline Mythus

  • Usuário Ubuntu
  • *
  • Mensagens: 264
  • Liga dos Dinos
    • Ver perfil
    • http://www.protopage.com/skopein
Re: COMO FAZER? shellscript: pegar o PID de um programa executado
« Resposta #2 Online: 31 de Agosto de 2007, 20:07 »
Código: [Selecionar]
ps -A |grep programa | cut -d " " -f 2  :D
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.

Offline clcampos

  • Administrador
  • Usuário Ubuntu
  • *****
  • Mensagens: 10.790
  • .:: User Linux #439596 ::.
    • Ver perfil
Re: COMO FAZER? shellscript: pegar o PID de um programa executado
« Resposta #3 Online: 31 de Agosto de 2007, 20:43 »
Código: [Selecionar]
ps -A |grep programa | cut -d " " -f 2  :D

hehehe.... Isso se não existir uma instância anterior deste programa rodando. Acho que deve ter uma forma mais direta, mas tem que pesquisar.
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

Offline Mythus

  • Usuário Ubuntu
  • *
  • Mensagens: 264
  • Liga dos Dinos
    • Ver perfil
    • http://www.protopage.com/skopein
Re: COMO FAZER? shellscript: pegar o PID de um programa executado
« Resposta #4 Online: 31 de Agosto de 2007, 23:49 »
Vamos testar:

Código: [Selecionar]
$ ps -A |grep bash
  555 pts/1    00:00:04 bash
 4121 tty1     00:00:00 bash
 4203 tty2     00:00:00 bash
 6354 pts/2    00:00:00 bash
 6421 pts/3    00:00:00 bash
 8212 pts/0    00:00:00 bash
 8244 pts/0    00:00:00 bash

Algumas saídas são realmente diferentes, outras nem tanto:

Código: [Selecionar]
$ /sbin/pidof -x bash
8212 6421 6354 555

Código: [Selecionar]
$ /sbin/pidof -c bash
8212 6421 6354 555

Código: [Selecionar]
$ ps -A |grep bash |grep -v grep | cut -d " " -f 1,2
 
 4121
 4203
 6354
 6421
 8212
 8244

Código: [Selecionar]
$ ps -A |grep bash |grep -v grep | cut -c 1-6
  555
 4121
 4203
 6354
 6421
 8212
 8244

Nesse último exemplo, o ruim é saber qual é o maior PID para não "cortar o número", então, pra contornar, fica:
Código: [Selecionar]
$ ps -A |grep bash |grep -v grep | cut -c 1-`ps -A | sort -n | tail -n 1 | cut -d " " -f 1 | wc -c` |head -n -2
  555
 4121
 4203
 6354
 6421
 8212
 8244

Com certeza essa última é a maneira mais ineficiente :D
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.

Offline Mythus

  • Usuário Ubuntu
  • *
  • Mensagens: 264
  • Liga dos Dinos
    • Ver perfil
    • http://www.protopage.com/skopein
Re: COMO FAZER? shellscript: pegar o PID de um programa executado
« Resposta #5 Online: 31 de Agosto de 2007, 23:53 »
Não falei?! ;D

Código: [Selecionar]
$ time ps -A |grep bash ; time /sbin/pidof -x bash ; time /sbin/pidof -c bash ; time ps -A |grep bash |grep -v grep | cut -d " " -f 1,2 ; time ps -A |grep bash |grep -v grep | cut -c 1-6 ; time ps -A |grep bash |grep -v grep | cut -c 1-`ps -A | sort -n | tail -n 1 | cut -d " " -f 1 | wc -c` |head -n -2
  555 pts/1    00:00:04 bash
 4121 tty1     00:00:00 bash
 4203 tty2     00:00:00 bash
 6354 pts/2    00:00:00 bash
 6421 pts/3    00:00:00 bash
 8212 pts/0    00:00:00 bash
 8244 pts/0    00:00:00 bash

real    0m0.047s
user    0m0.010s
sys     0m0.018s
8212 6421 6354 555

real    0m0.051s
user    0m0.004s
sys     0m0.020s
8212 6421 6354 555

real    0m0.051s
user    0m0.006s
sys     0m0.018s
 
 4121
 4203
 6354
 6421
 8212
 8244

real    0m0.044s
user    0m0.006s
sys     0m0.022s
  555
 4121
 4203
 6354
 6421
 8212
 8244

real    0m0.052s
user    0m0.008s
sys     0m0.023s
  555
 4121
 4203
 6354
 6421
 8212
 8244

real    0m0.085s
user    0m0.026s
sys     0m0.039s
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.

Offline crixtiano

  • Usuário Ubuntu
  • *
  • Mensagens: 339
    • Ver perfil
Re: COMO FAZER? shellscript: pegar o PID de um programa executado
« Resposta #6 Online: 02 de Setembro de 2007, 00:59 »
bem, obrigado pelas contribuições, mas se não estou lendo errado, parece que existe uma certa discordância em achar uma boa solução, ein?

para facilitar, vou dizer p/ q eu kero isso.

Eu tenho um servido com IP fixo e várias máquinas com IP de rede interna do tipo 172.168.0.X .

De vez em quando eu entro nesse servidor e acesso essas máquinas com IP 172.etc, para manutenção. Mas para fazer isso, é necessário que o usuário do PC com IP 172.etc, conecte-se ao servidor com IP fixo por SSH.

Eu gostaria de fazer um comando , simplificado que conectasse o pc do usuário com o servidor qnd esse "apertar um botão" . Porém, para manter uma segurança legal, eu gostaria que o usuário pudesse "matar" essa conexão quando ele desejasse.

Enfim, talvez exista algum programa que executasse qualquer outro e já devolveria o PID do que foi executado. Tem? Ex.:

Citar
$ getPID "ls -la"
45151


Existe algum programa como esse hipotético "getPID" aí acima?

Offline Mythus

  • Usuário Ubuntu
  • *
  • Mensagens: 264
  • Liga dos Dinos
    • Ver perfil
    • http://www.protopage.com/skopein
Re: COMO FAZER? shellscript: pegar o PID de um programa executado
« Resposta #7 Online: 02 de Setembro de 2007, 07:27 »
bem, obrigado pelas contribuições, mas se não estou lendo errado, parece que existe uma certa discordância em achar uma boa solução, ein?

Na verdade não existe uma discordância. O que a gente mostrou é que existe várias formas de se chegar a tarefa que você propôs. Sendo o /sbin/pidof o programa específico para a sua tarefa (o seu "getPID").

para facilitar, vou dizer p/ q eu kero isso.

Desculpa, cara, mas não facilitou nada. Não consegui entender lhufas. Porque se é o usuário na máquina cliente que está fazendo uma conexão via ssh, como você espera controlar os comandos que ele está dando durante essa conexão? O que você quer é, sabendo que ele conectou via ssh, você conecte com a máquina dele via ssh? É isso?
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.

Offline crixtiano

  • Usuário Ubuntu
  • *
  • Mensagens: 339
    • Ver perfil
Re: COMO FAZER? shellscript: pegar o PID de um programa executado
« Resposta #8 Online: 03 de Setembro de 2007, 10:07 »
Brother, que confusão,  :) acho que minha dúvida é bastante simples, veja:


Eu preciso somente de: quando um usuário executar algum programa, armazenar imediatamente o pid gerado por esse programa. Assim, a qualquer momento poderei matar a instância desse programa com o seu PID.

Existe algum programa, no linux, que execute qualquer programa e imprima o seu PID na tela? Por exemplo, supondo que o programa que eu queira possa se chamar "getPID", então seria mais ou menos assim:

Citar
$ getPID "ls -la"
1546

Ou seja, traduzindo:    "getPID" executa o comando "ls -la" e diz: o pid de "ls" é 1546.


Existe algum programa (ou pelo menos, algum meio) para se chegar no objetivo desse "getPID" fictício?

Obrigado




Offline crixtiano

  • Usuário Ubuntu
  • *
  • Mensagens: 339
    • Ver perfil
Re: COMO FAZER? shellscript: pegar o PID de um programa executado
« Resposta #9 Online: 03 de Setembro de 2007, 11:28 »
ai pessoal

eu descobri como se faz

Se você digitar no console o comando seguido de &, o programa é executado e o PID dele é apresentado...

Citar
$ gedit &
[3] 3074

Esse é o PID dessa instância do gedit.
kill -p 3074 mata o processo


abraços

Offline Mythus

  • Usuário Ubuntu
  • *
  • Mensagens: 264
  • Liga dos Dinos
    • Ver perfil
    • http://www.protopage.com/skopein
Re: COMO FAZER? shellscript: pegar o PID de um programa executado
« Resposta #10 Online: 03 de Setembro de 2007, 15:42 »
O problema é que o que você disse aqui:

eu preciso desenvolver um script que faça isso:

1) execute um programa qualquer
2) pegue o pid desse programa que acabou de ser executado

Como fazer isso usando shellscript?

É diferente do que você disse aqui:

Eu preciso somente de: quando um usuário executar algum programa, armazenar imediatamente o pid gerado por esse programa. Assim, a qualquer momento poderei matar a instância desse programa com o seu PID.

Muitíssimo diferente do que você disse aqui:

Ou seja, traduzindo:    "getPID" executa o comando "ls -la" e diz: o pid de "ls" é 1546.

Por isso que todas as soluções mostradas eram para, dado um programa já em execução por um usuário qualquer, achar o PID dele.

O & no final é uma forma de jogar o programa que você está executando nesse exato momento em background e, por isso, imprime o PID na tela. O & só funciona no shell, dentro de um shellscript ele vai lançar os comandos para backgroud sem imprimir o PID na tela.
Veja esses casos:

Código: [Selecionar]
$ ./dir.sh
$ wget-log.1 wget-log.3  wget-log.5  wget-log.7  wget-log.9

Código: [Selecionar]
$ ls &
[1] 29841
$ wget-log.1 wget-log.3  wget-log.5  wget-log.7  wget-log.9
[1]+  Done                    ls --color=tty

Código: [Selecionar]
$ ls
wget-log.1 wget-log.3  wget-log.5  wget-log.7  wget-log.9
$

Perceba que nos dois primeiros o terminal está livre para continuar trabalhando (tanto que a saída é "jogada" na linha seguinte de $) enquanto no último a $ só é liberada após a execução integral do programa, inclusive a impressão da saída. Apesar da impressão da saída estar "numa linha de comando", de fato não está, você pode testar com "enter" que ele não tentará executar wget-log.1 wget-log.3  wget-log.5  wget-log.7  wget-log.9 (no caso em tela).

Mas fico feliz que você encontrou a solução para o seu problema.
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.