Como encerrar um processo em segundo plano no Linux quando o pid é desconhecido?

1

Eu tenho um script de shell bash do job dispatcher contendo os códigos abaixo:

for (( i=0; i<$toBeDoneNum; i=i+1 ))
do
    while true
    do
            processNum='ps aux | grep Checking | wc -l'
            if [ $processNum -lt $maxProcessNum ]; then
                break
            fi
            echo "Too many processes: Max process is $maxProcessNum."
            sleep $sleepSec
    done
    java -classpath ".:./conf:./lib/*" odx.comm.cwv.main.Checking $i
done

Eu corri o script como este para estar em segundo plano:

./dispatcher.sh &

Desejo terminar este processo de dispatcher com kill -9 . Mas eu não gravei o pid do processo do despachante na primeira vez. Eu usei trabalhos, jobs -l , jobs -r e jobs -s . Nada apareceu. Mesmo esse fg não pode trazer o processo para o primeiro plano.

fg
bash: fg: current: no such job

Mas acho que esse processo de dispatcher ainda está em execução porque ainda continua a atribuir o programa java para execução (já usado top e ps -ef para verificar). Como devo terminar este processo de script de shell bash do job dispatcher?

    
por Marcus Thornton 13.01.2014 / 04:34

3 respostas

4

Você deve poder apenas matar o script pelo nome usando o comando pkill .

$ pkill -9 dispatcher.sh

excerto da página do manual

pgrep, pkill - look up or signal processes based on name and other 
               attributes

OPTIONS
       -signal
       --signal signal
              Defines the signal to send to each matched process.  Either 
              the numeric or the symbolic signal name can be used.  (pkill 
              only.)

Veja a página de manual para pkill para mais informações.

Encontrando processos

Se você achar que não conhece mais o ID do processo (PID) de um processo, poderá encontrá-lo de várias maneiras.

pgrep

Você pode usar pgrep para encontrar um processo pelo nome.

$ pgrep dispatcher.sh
12345

Você pode então executar um kill -8 12345 .

ps

A maioria das pessoas aprendeu a encontrar PIDs usando ps . Você pode procurar seu processo na saída assim.

$ ps -eaf | grep [d]ispatcher.sh
saml      2735     1  0 Jan11 ?        00:02:50 dispatcher.sh

O PID é a segunda coluna na saída (normalmente). O truque acima em que eu envolvo a primeira letra do processo que estou procurando elimina a grep de aparecer nos resultados. Experimente sem os colchetes para ver o que quero dizer.

    
por 13.01.2014 / 04:38
0

Se você puder ver os processos Java gerados pelo dispatcher na saída do ps, tente verificar o PPID desses processos. Verifique se é um processo bash e, em caso afirmativo, tente eliminá-lo.

    
por 15.01.2014 / 16:13
0

Dado o seu script completo, parece que o que você está tentando fazer é simplesmente ter um determinado número de tarefas em execução em paralelo. Usando o GNU Parallel, é assim:

# -q to avoid lib/* expanding
seq 0 $toBeDoneNum |
  parallel -j $maxProcessNum -q java -classpath ".:./conf:./lib/*" odx.comm.cwv.main.Checking
    
por 14.04.2017 / 07:19