为什么 kill 没有文件参数而不是端口号?

Nik*_* R. 0 shell networking process kill

如果我想根据其 tcp 端口号或其文件或命名的可执行文件停止程序,我可以运行类似kill -tcpPortNumber $1参数$1为 tcp 端口号或kill -filename $1参数为文件名的程序吗?背景是以下问题中的一个问题:

/sf/ask/810849371/

这个问题在实践中确实发生过,我认为用户 Bepetersn 有一个看起来像我的意思的解决方案。 sudo kill $(fuser -n tcp <port_number> 2> /dev/null)

但是我想要实现的是,kill 程序可以将 tcp 端口号和/或文件名作为任何用户(包括 sudo)的系统范围参数。那么是否可以将系统范围内的参数添加到像 kill 这样的系统程序中,以便 tcp 端口号和/或文件名可以作为参数,并且这种更改对于包括 ubuntu sudo 在内的任何用户都是永久性的?

Bra*_*iam 5

自古以来,UNIX 的哲学就是“构建简短、简单、清晰、模块化和可扩展的代码”,因此,基于端口号进行杀戮的超级工具太复杂而无法维护,另一方面,kill它旨在发送向进程发出信号(恰好结束它们)不一定“杀死”它们。

我已经搜索了一个可以做到这一点的工具,但没有人发现只能做到这一点(通常它们与其他工具/功能捆绑在一起,或者使用起来很复杂)。当然,您可以使用kill -SIGNAL $(lsof -i:port)发送任何您喜欢的信号。


slm*_*slm 5

不,不可能以kill您要求的方式修改工具,例如通过配置。但是鉴于所有工具通常都以源代码形式提供,您可以随时使用任何工具并以您喜欢的任何方式对其进行修改。

然而,大多数工具都通过以下方式之一进行扩展:

1.包装

此外,大多数人倾向于使用 shell 脚本或别名或它们各自的 shell(Bash、Zsh、Ksh 等)中的函数来“包装”大多数 Unix 系统上通常提供的命令。

2. 高级语言

此外,许多由工具调用的 glibc 库kill也暴露于更高级别的语言,因此您可以使用 Python、Perl 或 Ruby 等语言创建您想要的任何工具。

3. 链接

最后一种方法可能是大多数人倾向于使用的方法。您从一个命令中获取输出并将其与另一个工具一起用作输入。命令行中的整个 UI 都是以这个单一目的构建的。因此,您可以使用许多构造来完成此操作。

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

名单还在继续......

你的问题

所以使用以下命令:

$ sudo kill $(fuser -n tcp <port_number> 2> /dev/null)
Run Code Online (Sandbox Code Playgroud)

你可以把它包装成一个 Bash 函数:

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

稍微改变一下,以便我们可以看到运行它时会发生什么:

$ mykill () { echo "sudo kill \$(fuser -n tcp "$1" 2> /dev/null)"; }
$ mykill 123
sudo kill $(fuser -n tcp 123 2> /dev/null)
Run Code Online (Sandbox Code Playgroud)