电脑技术学习

标准化您的 UNIX 命令行工具

dn001

  对于支持别名无法在其中工作的某些命令和组合,对命令行参数的支持非常关键。例如,killall 命令最基本的功能是终止所有与特定字符串匹配的命令。该命令并非在所有平台上都可用,但是一旦您了解了它,就会希望在其他环境中使用它。

  在 Solaris 上,killall 命令存在,但是将其用作关闭过程的一部分以终止所有进程。设想在 Solaris 主机上意外调用 killall 命令以关闭所有 Apache 进程,没想到却实际上关闭了系统!

  提供替代——在所有主机上使用相同的名称或使用不同的名称——可以实现按名称终止进程的预期结果,并消除不希望的和可能代价高昂的错误,同时扩展本身并不支持该选项的系统的功能。

  该命令的关键部分是能够识别正在运行的进程,提取与给定字符串匹配的进程,并使用 kill 命令将 KILL 信号发送到每个匹配进程。在命令行上,您可以通过一系列管道实现等效的功能(使用 KILL 信号),如清单 5 所示。

  清单 5. 提供 killall 命令的替代

$ ps -ef|grep gcc|awk '{ print $2; }'|xargs kill -9

  该命令的关键部分是提供给 grep(在此示例中为 gcc)的字符串和 ps 输出中包含所需进程 ID 的列。上面的例子对 Solaris 主机和大多数 SVR4 Unix 变种有效。

  别名在此示例中无法工作,因为您希望能够插入命令中的信息不在结尾;别名所实现的是一种展开方法。然而,内联外壳函数正好适合这种情况。

  在支持 Bourne 语法(bash 和 zsh)的外壳中,您可以使用清单 6 所示的以下语法来定义函数。

  清单 6. 定义函数

function NAME()
{
# do stuff here
}

  调用函数时,函数参数作为 $1、$2 等形式来提供,就像在典型的外壳脚本中一样。因此,您可以定义一个函数,使其执行与 killall 相同的基于字符串的信号发送功能(请参见清单 7)。

标签: