Por que matar não tem um parâmetro para o arquivo e não para o número da porta?

0

Se eu quiser parar um programa com seu número de porta tcp ou seu arquivo ou executável nomeado, posso executar algo como kill -tcpPortNumber $1 em que o parâmetro $1 é um número de porta tcp ou kill -filename $1 em que o parâmetro é um nome do arquivo? O fundo é um problema na seguinte pergunta:

link

O problema ocorre na prática e eu acho que o usuário Bepetersn tem uma solução que se parece com o que quero dizer. sudo kill $(fuser -n tcp <port_number> 2> /dev/null)

Mas o que eu gostaria de alcançar é que o programa kill poderia levar o número da porta tcp e / ou filename como um parâmetro para todo o sistema para qualquer usuário, incluindo o sudo. Então é possível adicionar parâmetros para todo o sistema a um programa do sistema como kill para que o número da porta tcp e / ou um nome de arquivo possam ser parâmetros e que essa mudança seja permanente para qualquer usuário, incluindo o ubuntu sudo?

    
por Niklas Rosencrantz 20.02.2014 / 23:41

2 respostas

5

Não, não é possível modificar ferramentas como kill via configurações da maneira que você está pedindo. Mas, dado que todas as ferramentas estão geralmente disponíveis na forma de código-fonte, você pode sempre pegar qualquer ferramenta e modificá-la da maneira que desejar.

A maioria das ferramentas, no entanto, é estendida de uma das seguintes maneiras:

1. embrulho

Além disso, a maioria das pessoas tende a "agrupar" os comandos que são normalmente fornecidos na maioria dos sistemas Unix usando scripts shell ou aliases ou funções dentro de seus respectivos shells (Bash, Zsh, Ksh, etc.).

2. linguagens de alto nível

Além disso, muitas das bibliotecas glibc que são chamadas por ferramentas como kill também estão expostas a linguagens de nível superior, portanto você pode criar as ferramentas que desejar em linguagens como Python, Perl ou Ruby.

3. encadeamento

Este último método é provavelmente o que a maioria das pessoas costuma usar. Você pega a saída de um comando e usa-a junto com outra ferramenta como entrada. Toda a interface do usuário da linha de comando é construída com esse propósito único em mente. Portanto, existem muitas construções à sua disposição para fazer exatamente isso.

$ kill $(pgrep myscript.sh)
$ find . -type f -exec ... {} +
$ ls -l | grep ...
$ find . -type f -print0 | xargs ....

A lista continua ...

Seu problema

Com o seguinte comando:

$ sudo kill $(fuser -n tcp <port_number> 2> /dev/null)

Você pode incluir isso em uma função Bash:

$ mykill () { sudo kill $(fuser -n tcp "$1" 2> /dev/null); }

Altere isso um pouco para vermos o que acontece quando o executamos:

$ mykill () { echo "sudo kill \$(fuser -n tcp "$1" 2> /dev/null)"; }
$ mykill 123
sudo kill $(fuser -n tcp 123 2> /dev/null)
    
por 21.02.2014 / 00:09
5

Desde os velhos tempos, a filosofia UNIX tem "construído códigos curtos, simples, claros, modulares e extensíveis", portanto, uma super ferramenta que mata com base no número da porta é complicada demais para ser mantida, por outro lado, kill foi destinado a enviar sinais para o processo (o que acontece para terminá-los) não necessariamente "para matá-los".

Eu procurei por uma ferramenta que faz isso, nenhuma que só faz isso (normalmente eles vem junto com outras ferramentas / funcionalidades ou são complexos de uso). Claro que você pode usar kill -SIGNAL $(lsof -i:port) para enviar qualquer sinal que desejar.

    
por 20.02.2014 / 23:57