Obtenha o PID do processo iniciado na tela por su

1

eu tenho um script simples que inicia o quassel-core em uma sessão de tela como usuário diferente! O script é:

#!/bin/sh
su ircc -c 'screen -dmS quassel /home/ircc/quassel/quassel-core'

Eu quero começar e parar isso em um script init.d debian usando start-stop-daemon Qual é a melhor maneira de obter o PID do quassel-core (ou da tela, que deve funcionar também) e armazená-lo em um arquivo? No momento eu uso:

pidof quassel-core > /var/run/quasselcore.pid

mas isso falhará se algum outro usuário iniciar o quassel-core.

    
por Josef 14.05.2012 / 18:08

5 respostas

3

Parece que você está feliz apenas para matar uma sessão de tela nomeada pertencente ao seu usuário e não está realmente interessada no pid. Nesse caso, com uma tela chamada " quassel ", você pode executar

screen -S quassel -X quit

que de acordo com o manual

Kill all windows and terminate screen.

Apenas as telas pertencentes a você são afetadas.

    
por 15.05.2012 / 08:39
3

No pacote procps (ou algo semelhante, dependendo da distribuição), você pode encontrar pgrep :

pgrep looks through the currently running processes and lists the process IDs which matches the selection criteria to stdout.

Então, no seu caso:

pgrep -u josef quassel-core

deve fornecer uma lista dos IDs do processo que estão em execução no momento quassel-core processos iniciados pelo usuário josef .

No pacote, você também obtém pkill , que mata um processo baseado em um processo de busca similar, então você não precisa realmente de um arquivo pid se isso for tudo o que você vai usar.

Tudo o que foi dito: se você usar start-stop-daemon , poderá usar a opção --pidfile para iniciar o processo. Veja man start-stop-daemon para uso.

    
por 14.05.2012 / 18:17
1

Depois de mais algumas tentativas, aqui está minha própria solução:

screen -list | grep quassel | cut -f1 -d'.' | sed 's/\W//g'

Lê o pid da tela com o nome "quassel" Parece ser o caminho mais seguro para mim.

Obrigado também a Daniel Andersson, isso deve funcionar também.

start-stop-daemons --pidfile é inútil, porque não cria o pidfile! Com -m ele armazenaria o pid da tela iniciado, mas a tela parece se separar no início, então o pid muda!

    
por 15.05.2012 / 05:02
0

Isso funcionaria para você?

ps -ef | grep quassel-cor[e] | awk '{print $2}' > /var/run/quasselcore.pid

Isso pressupõe que haja apenas um desses processos em execução. Se isso não for verdade, você precisa refinar ainda mais o seu grep.

    
por 14.05.2012 / 18:16
0

Se você quiser que o PID do processo seja executado na tela, respondi que em outra pergunta deste Stack Overflow . Aqui está o conteúdo dessa resposta:

Você pode obter o PID das sessões de tela aqui assim:

$ screen -ls
There are screens on:
        1934.foo_Server         (01/25/15 15:26:01)     (Detached)
        1876.foo_Webserver      (01/25/15 15:25:37)     (Detached)
        1814.foo_Monitor        (01/25/15 15:25:13)     (Detached)
3 Sockets in /var/run/screen/S-ubuntu.

Vamos supor que você queira que o PID do programa seja executado no Bash na sessão de tela foo_Monitor . Use o PID da sessão de tela foo_Monitor para obter o PID da sessão bash em execução, pesquisando os PPIDs (Parent PID) para o PID conhecido:

$ ps -el | grep 1814 | grep bash
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  1815  1814  0  80   0 -  5520 wait   pts/1    00:00:00 bash

Agora, pegue apenas o PID da sessão bash :

$ ps -el | grep 1814 | grep bash | awk '{print $4}'
1815

Agora queremos o processo com esse PID. Apenas aninhe os comandos e, desta vez, use o -v flag em grep bash para obter o processo que é not bash:

echo $(ps -el | grep $(ps -el | grep 1814 | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
23869

Basta substituir 1814 pelo PID real ou pela sua sessão de tela:

echo $(ps -el | grep $(ps -el | grep SCREEN_SESSION_PID | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
    
por 08.02.2015 / 15:47