【问题标题】:Why doesn't "echo" show up in "ps"?为什么“回声”没有出现在“ps”中?
【发布时间】:2015-03-03 19:22:38
【问题描述】:

我很难理解 ps 命令显示的内容。为了测试我的理解,我在虚拟脚本下面创建了

 #!/bin/bash
 for i in {1..100000}
 do
  date -u
  date -u
  date -u
 done

在运行此脚本时,我打开了一个新终端并反复执行

ps -eaf | grep date | grep -v grep

并且我能够在输出中记录过程。

我后来更改了虚拟脚本,将 date -u 替换为 echo "what is going on"

     #!/bin/bash
     for i in {1..100000}
     do
      echo "What is going on"
      echo "What is going on"
      echo "What is going on"
     done

在运行更新的虚拟脚本时,我打开了一个新终端并重复执行

ps -eaf | grep echo | grep -v grep

并且 echo 从未在输出中显示。为什么是这样?我怀疑原因是脚本是 bash 脚本,可能是它使用了内置 echo,因此它没有显示在 ps 输出中。我对么?我在这里想念什么?

【问题讨论】:

  • 如您所料,echo 不是一个进程。这是一个 shell 内置命令。
  • 原始标题非常含糊不清——而且也不能以跨平台的方式直接回答(POSIX 的 ps 输出格式规范留给个人很多实施,除非确保符合 XSI)。
  • ...尽管许多 POSIX sh 实现确实构建在 echo.
  • 顺便说一句,您要解决的实际问题是什么?这是出于锁定目的,还是为了确保单个流程实例,ps绝对不适合这项工作(请参阅flock)。
  • (另外,在这里插入一些关于将 POSIX sh 与 Bourne 混为一谈的抱怨——后者比前者早 20 年出生)。

标签: linux bash unix ps


【解决方案1】:

echo 是 bash 内置的:

$ type echo
echo is a shell builtin

这意味着在运行echo 时不会创建新进程。所有工作都由bash 进程完成,效率更高。

您可以显式运行非内置 echo

command echo "What is going on"

这个分支并执行 /bin/echo,让它显示在 ps 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-27
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多