AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 419284
Accepted
guettli
guettli
Asked: 2018-01-25 00:38:25 +0800 CST2018-01-25 00:38:25 +0800 CST 2018-01-25 00:38:25 +0800 CST

pkill que espera

  • 772

Existe uma ferramenta do tipo pkill que faz isso:

  1. enviar sinal para todos os processos correspondentes
  2. espere N segundos até que os processos terminem
  3. se todos os processos terminaram, legal: sair
  4. se alguns processos não terminaram envie SIGKILL

Para mim é importante que a ferramenta espere até que os processos realmente terminem.

Eu sei que é muito fácil fazer isso na minha linguagem de script favorita, mas neste caso seria muito bom se eu usasse uma ferramenta que já existe.

Isso precisa ser executado no SuSE-Linux e no Ubuntu.

command-line kill
  • 3 3 respostas
  • 3133 Views

3 respostas

  • Voted
  1. Best Answer
    Stephen Kitt
    2018-01-25T01:02:04+08:002018-01-25T01:02:04+08:00

    Não existe um comando “padrão” que forneça o comportamento que você procura. No entanto, no Debian e derivados, você pode usar a ação start-stop-daemon's --stopcom a --retryopção:

    start-stop-daemon --stop --oknodo --retry 15 -n daemontokill
    

    enviará SIGTERMpara todos os processos nomeados daemontokill, esperará até 15s para que eles parem, então enviará SIGKILLpara todos os processos restantes (da seleção inicial) e esperará mais 15s para que eles morram. Ele sairá com status 0 se não houver nada para matar ou todos os processos parados, 2 se alguns processos ainda estiverem ativos após o segundo tempo limite.

    Existem várias opções para combinar processos de várias maneiras, consulte a documentação (link acima) para obter detalhes. Você também pode fornecer uma programação mais detalhada com tempos limite variados.

    start-stop-daemonfaz parte do dpkgpacote, portanto está sempre disponível nos sistemas Debian (e derivados). Algumas não .deb-distribuições também disponibilizam o pacote; por exemplo, openSUSE Leap 42 tem. É bastante simples construir em outras plataformas:

    git clone https://salsa.debian.org/dpkg-team/dpkg.git 
    cd dpkg
    autoreconf -fi && ./configure && make
    

    Você vai precisar autoconfde , automake, libtool, gettext. Assim que a compilação estiver concluída, você encontrará start-stop-daemonno utilsdiretório.

    • 9
  2. Rabin
    2018-02-12T14:26:46+08:002018-02-12T14:26:46+08:00

    Você pode usar o timeoutcomando comkillall -w

    por exemplo:

    # timeout 3 killall -vws2 $PROCESS_NAME || killall -vws9 $PROCESS_NAME
    

    timeoutirá "tempo limite" após 3 segundos e sairá com o código de erro, que então você pega ||e então corre killall -s9para forçar o kill.

    • 6
  3. Neurootic
    2018-02-09T07:53:31+08:002018-02-09T07:53:31+08:00

    Você pode criar seu próprio roteiro que atenderá ao seu caso. Seguindo este post uso inútil de kill -9 e source reallykill

    #!/bin/sh
    #
    # $Id: reallykill,v 1.2 2004/10/11 09:36:48 jmates Exp $
    #
    # The author disclaims all copyrights and releases this script into the
    # public domain.
    #
    # Kills the specified processes by starting with the TERM signal and
    # only if necessary working up to the violent KILL signal. For more
    # information, see:
    #
    # http://sial.org/howto/shell/kill-9/
    
    if [ -z "$1" ]; then
      echo "usage: `basename $0` pid [pid ..]" >&2
      exit 100
    fi
    
    cycle_kill () {
      PID=$1
      RETVAL=0
    
      for signal in "TERM" "INT" "HUP" "KILL"; do
        kill -$signal $PID
        RETVAL=$?
        [ $RETVAL -eq 0 ] && break
        echo "warning: kill failed: pid=$PID, signal=$signal" >&2
        sleep 1
      done
    
      return $RETVAL
    }
    
    for pid in "$@"; do
      cycle_kill $pid
    done
    

    Então você pode apenas baixar o script para o seu diretório bin:

     curl http://web.archive.org/web/20080213192428if_/http://sial.org:80/howto/shell/kill-9/reallykill > $HOME/bin/killwait && chmod +x $HOME/bin/killwait
    

    Eu usaria assim:

    ping -q localhost &
    killwait `pidof ping`
    

    Talvez você queira alterar a ordem dos sinais com INT primeiro, para ter uma saída com o resumo do comando ping. O comando fornecido não espera se o sinal KILL for bem-sucedido, mas deve funcionar, pois o processo será encerrado pelo sistema.

    • 2

relate perguntas

  • Execute o aplicativo X remotamente, execute a GUI no host remoto [fechado]

  • Silenciosamente matar subshell?

  • Sair do script de um processo em segundo plano?

  • Fazendo mysql CLI me pedir uma senha interativamente

  • Pub / sub de linha de comando sem um servidor?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve