Por que meu script chamado “killl” falha, mas depois da renomeação funcionar perfeitamente?

12

O script em questão encerra o processo mais recente em minha porta local 8080.

#!/bin/bash
x=$(lsof -i:8080 | tail -1 | awk '{print $2}')
kill -9 $x

Não funcionou, se o script foi chamado de 'killl' (get it? Kill Latest?). Ele me deu uma solicitação para cmdsubst> Renomear o script para 'asdf', tudo funciona. Existe uma explicação para esse comportamento? Estou usando o MacOS El Capitán.

    
por Zeick 31.10.2017 / 10:32

2 respostas

27

cmdsubst> é o prompt secundário impresso pelo shell zsh quando está aguardando o término de uma substituição de comando que está sendo inserida.

Se você obtiver esse prompt depois de digitar killl<Return> , a única explicação razoável é que você tem um alias (que é alguma forma de expansão de macro de string) para killl que se expande para algo que contém% co_de não finalizado. % de substituição de comandos, como:

$ alias 'killl=echo $(lsof -ti'
$ killl :22
cmdsubst>

Em que $(...) está pedindo para você fechar essa substituição do comando zsh .

Mais algumas notas:

  • a saída de $(...) é classificada por pid. os números de pid são empacotados, um pid maior não é uma garantia de que o processo foi iniciado mais tarde.
  • lsof informará os soquetes TCP ou UDP que têm a porta 8080 como a porta de origem ou de destino, seja um soquete de escuta, aceitação ou conexão.
  • Se você deseja obter apenas o pid, use a opção -i:8080 de -t : lsof
  • lsof -ti:8080 | tail -n2 é kill -9 , que envia um sinal de que o aplicativo não pode agir para sair normalmente. Deve ser usado apenas como último recurso.

Para eliminar o processo iniciado mais recentemente que possui um limite de soquete (final) na porta 8080, você pode fazer:

#! /bin/sh -
unset IFS
pids=$(lsof -ti:8080) &&
  LC_ALL=C ps -o pid=,lstart= -p $pids |
  LC_ALL=C sort -k6,6n -k4,4M -k3,3n -k5,5 -k1,1n |
  awk 'END{system("kill " $1)}'

(assume% GNUkill -s KILL (como encontrado no macOS) e uma implementação sort que suporta a coluna ps (como macOS 'e procps-ng's, embora o código tenha que ser atualizado para procps-ng onde os campos mês e dia são trocados)).

    
por 31.10.2017 / 11:57
1

It gave me a prompt for cmdsubst>

Porque quando você digitou o comando, você não digitou

killl
você digitou
killl $(
ou similar. Isso não tem nada a ver com o nome do script, ou mesmo que seja um script em primeiro lugar. Você poderia ter conseguido o mesmo efeito com um comando totalmente inexistente:
Zeick $(
O analisador do shell estava esperando mais entradas para concluir o comando apenas parcialmente completo. Seu pensamento sobre o nome do script é um completo arenque vermelho.     
por 31.10.2017 / 11:42