【问题标题】:how to see if a process by name is running in tcl如何通过名称查看进程是否在 tcl 中运行
【发布时间】:2015-09-17 11:16:54
【问题描述】:

我想通过 tcl 中的名称给定的进程使用 pidof。我用过[exec pidof $proc_name ],但是总是返回错误:子进程异常退出

我在某处读到 exec 总是将非零返回视为错误,因为 pidof 返回进程 ID 号。有谁知道是否有解决方法?提前致谢!

我想使用 pidof 是我想查看该进程是否正在运行,如果没有,我将重新启动该进程。

【问题讨论】:

  • 如果我使用命令行 ps -C $proc_name ([exec ps -C $proc_name]),结果是一样的。
  • 我有诸如“set rc [catch {exec pgrep $proc_name} ]”或“set rc set rc [catch {pidof $proc_name} ]”或“set rc [catch {exec ps -C $proc_name} ]”。无论进程是否正在运行,rc 总是得到值 1。所以我无法知道进程是否正在运行。它适用于这里的某些人,但不适用于我。它看起来像一个操作系统分布问题。我的操作系统是 centos "2.6.18-274.el5PAE #1 SMP"
  • 我也看过这篇文章“stackoverflow.com/questions/2903354/…”。在bash下,它总是返回值1。有人有什么想法吗?
  • 所以我的两台电脑的 bash 版本是 GNU bash,版本 4.1.2(1)-release (x86_64-redhat-linux-gnu) 和 GNU bash,版本 3.2.25(1)-发布 (i386-redhat-linux-gnu)
  • 如果我有#!/bin/bash -e,它不会打印出任何东西。似乎脚本没有被执行。#!/bin/bash SERVICE=$1 ps -a | grep -v grep | grep $1 > /dev/null 结果=$? echo "退出代码:${result}" if [ "${result}" -eq "0" ] ;然后 echo "date: $SERVICE 服务正在运行,一切都很好" else echo "date: $SERVICE 没有运行" fi

标签: process tcl


【解决方案1】:

问题是pidof 确实strange things with exit codes

退出状态

  1. 至少找到一个具有请求名称的程序。
  2. 未找到具有请求名称的程序。

这与exec 的交互很糟糕,exec 将非零退出代码视为指示它应该告诉 Tcl 的其余部分存在错误。

处理这个问题的最简单方法是一个额外的 shell 脚本包装器。为方便起见,让我们将其隐藏在一个过程中:

proc pidof {name} {
    exec /bin/bash -c "pidof '$name'; exit \$(( \$? - 1 ))"
}

所做的只是在退出代码返回 Tcl 之前从退出代码中减去 1。

(您也可以使用the exec manual 中描述的技术来解决此问题,但我认为这次在 bash 方面更简单。)

【讨论】:

  • 警告:未经测试。现在无法通过 ssh 进入我的 linux 框进行检查。 :-)
  • 谢谢。它不起作用。当我尝试打印 pidof 过程的结果时,它会产生空行。不知道返回的是什么值。
  • 我也试过“catch”,不管进程是否运行,它总是返回1。
  • 有趣。我的 'pidof' 版本的手册页有 0 和 1 作为返回码(LinuxMint 17.2)。我想我会坚持使用“ps -C”。
  • set val [catch {exec ps -C $name}]; return $val 应该可以工作。如果返回值仍然为 1,则需要准确检查程序的执行方式,并确保 ps -C 在运行时找到它。
【解决方案2】:

我遇到了这个问题,最终导致我运行的旧 linux 环境出现了一些问题(没有 bash 和退出代码处理与busybox有点不同)。

我应该在任何地方都可以使用的解决方案类似于一些建议:

proc pidof {name} {
  catch {exec -ignorestderr -- pidof $name} pid
  if {[string is entier -strict $pid]} {
    return $pid 
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2022-07-24
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多