COMO FAZER? shellscript: pegar o PID de um programa executado

Iniciado por crixtiano, 31 de Agosto de 2007, 19:10

tópico anterior - próximo tópico

crixtiano

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


Diego_Rocha

ps aux | grep name_program
pidof programa

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

Mythus

Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.

clcampos

Citação de: Mythus online 31 de Agosto de 2007, 20:07
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!

Mythus

Vamos testar:

$ 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:

$ /sbin/pidof -x bash
8212 6421 6354 555


$ /sbin/pidof -c bash
8212 6421 6354 555


$ ps -A |grep bash |grep -v grep | cut -d " " -f 1,2

4121
4203
6354
6421
8212
8244


$ 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:
$ 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.

Mythus

Não falei?! ;D

$ 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.

crixtiano

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?

Mythus

Citação de: crixtiano 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?

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").

Citação de: crixtiano online 02 de Setembro de 2007, 00:59
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.

crixtiano

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




crixtiano

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

Mythus

O problema é que o que você disse aqui:

Citação de: crixtiano online 31 de Agosto de 2007, 19:10
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:

Citação de: crixtiano online 03 de Setembro de 2007, 10:07
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:

Citação de: crixtiano online 03 de Setembro de 2007, 10:07
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:

$ ./dir.sh
$ wget-log.1 wget-log.3  wget-log.5  wget-log.7  wget-log.9


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


$ 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.