在Linux上的killproc和pidofproc

8

我有一个脚本,使用killproc和procofpid命令,在64位的Suse上执行良好。但是当我在32位的redhat上执行脚本时,发现上述命令不存在。

我没有32位Suse和64位redhat机器来测试我的脚本。

我的猜测是,在64位redhat上应该有上述命令可用吗?还是这些命令只适用于Suse和redhat?

谢谢


1
不过,killpidof是可移植的。 - Tim Post
6个回答

9

killproc 是 Red Hat Enterprise Linux 5.4 中 /etc/init.d/functions 的一部分。

如果需要它,只需在脚本中执行:

. /etc/init.d/functions

以加载 shell 函数。它可能也存在于其他版本的 Red Hat 中,但此时我手头只有这个版本。


6
这些命令作为 Linux标准基础 (LSB) 的一部分而被 定义,如 @AndreKR 所指出。
然而,在某些系统上(如Redhat和可能的SUSE),这些函数可能不会在LSB指定的位置(/lib/lsb/init-functions)中被定义,取而代之的是在/etc/init.d/functions中被定义。此外,在某些版本中,Redhat变体的/etc/init.d/functions缺少LSB定义的start_daemon函数。如果您将以下代码段添加到脚本顶部,则可在大多数发行版/安装中实现可移植性:
if [[ -f /lib/lsb/init-functions ]]; then
  . /lib/lsb/init-functions
elif [[ -f /etc/init.d/functions ]]; then
  . /etc/init.d/functions
  # Pretend to be LSB-compliant
  function start_daemon() {
    daemon $*
  }
else
  echo "Linux LSB init function script or Redhat /etc/init.d/functions is required for this script."
  echo "See http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptfunc.html"
  exit 1
fi

1
你的说法“Redhat(可能还包括SUSE)没有按照LSB指定的位置定义它们”是错误的。元包lsb-core-noarch在符合LSB标准的发行版中提供文件/lib/lsb/init-functions。只需使用发行版包管理器进行安装即可。 - Samveen
@Samveen 謝謝你針對 lsb-core-noarch 套件的澄清和資訊。在 Fedora 24 上,它是 redhat-lsb-core。如果您不確定運行環境是否安裝了該套件,並且沒有能力或願望強制安裝該套件,則腳本片段仍然很有用。 - Raman
请检查redhat-lsb-core软件包的提供内容:您会注意到它提供了一个名为lsb-core-noarch的能力,这是一个元软件包,正如我在评论中提到的一样(rpmfind信息)。 - Samveen
@Samveen,你提供的rpmfind链接是一个外部网站,看起来信息已经过时。请参考这里:https://apps.fedoraproject.org/packages/redhat-lsb-core/overview/。`redhat-lsb-core`实际上是元包`redhat-lsb`的子包,并且它“提供”了`lsb-noarch`,这不是一个软件包而是一种能力。 - Raman
我在该页面上没有看到任何关于软件包“Provides:”部分的信息,因此我将链接到http://pkgs.fedoraproject.org/cgit/rpms/redhat-lsb.git/tree/redhat-lsb.spec的规范文件:请注意“%package core”下的“Provides:”。 总的来说,你没有理解我的观点:“start_daemon”已经在Fedora(或任何LSB兼容的发行版)中提供,只需要安装独立于发行版的能力“lsb-core-noarch”,使用发行版内置的软件包管理器。例如,“yum install lsb-core-noarch”或“apt-get install lsb-core-noarch”。 - Samveen
@Samveen 不,我没有错过重点,我从你的第一条评论中得到了那个观点。 - Raman

4
命令可能不太可移植。实际上这是我第一次听说它们 - 但我猜你的问题是按名称而不是pid处理进程。

查看man pgrepman pkill - 它们稍微更加可移植。它们是procps软件包的一部分(其中包括pstop),应该在所有Linux变体上都可用。它们也可用于Solaris。


2

0

我认为这些命令是特定于分发的:我以前从未见过它们。 killproc 应该是一种 kill 命令,但 procofpid 有什么作用呢?

在标题中,您提到了 pidofproc,您可以在大多数 Linux 系统上的 pidof 下找到此命令。


-1

我和你一样遇到了同样的问题,它会提示:

pidof:命令行选项无效!

我修改了

"killproc -d 10 $cmd" 

"kill -9 \`pidof $cmd\`" 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接