如何在启动 shell 时确定程序是否正在运行,如果该程序尚未运行,则如何启动该程序?

J36*_*363 6 shell bash fedora process zsh

当我启动 shell 时,在我的情况下是 bash 和/或 zsh,我需要向 .zshrc 和/或 .bashrc 添加哪些行来检查程序是否已经在运行,以及程序是否已经在运行,启动它?

示例:我正在启动一个新的 zsh shell。如果 top 尚未运行,我想启动 top 并让它接管 shell。如果 top 已经在另一个窗口中运行,我希望 .zshrc 继续加载并给我一个打开的终端。

6-16更新:

if ! pgrep -U $USER top >/dev/null; then
exec top
fi
Run Code Online (Sandbox Code Playgroud)

上面的脚本满足了我的要求。-q 标志对我不起作用,因为 -q 不是我系统上的选项。所以我不得不通过管道将 PID 传送到 /dev/null。谢谢 mveroone、Kusalananda 和 Thomas Dickey。

我有一些超出原始问题范围的功能蠕变。假设我在一个单用户系统上,我可以在不需要输入密码的情况下成为 root。如果需要,我将如何以 root 身份自动运行 top?

6-18 好的,以root身份传递命令的功能蠕变问题已解决。我用它来启动几个

感谢您的所有深思熟虑的答复。

Kus*_*nda 3

pgrep像这样使用:

if ! pgrep -u $USER top >/dev/null 2>&1; then
    exec top
fi
Run Code Online (Sandbox Code Playgroud)

解释:

  • pgrep如果发现该命令正在运行,则实用程序将以零退出代码退出。因此,否定该测试。
  • 还可以使用 来将其限制为当前用户-u $USER,这样它就不会因为某种原因而获取其他人的进程。$USER是一个标准的 shell 变量。如果由于某种原因没有定义,请尝试使用$LOGNAME,如果失败,请使用$( id -n -u )(但此时您必须问自己发生了什么事,因为$LOGNAME也是一个标准 shell 变量)。
  • 我们不需要以下的输出pgrep,因此将标准输出和错误流重定向到/dev/null

如果top(或其他)未发现正在运行,exec则根据OP的问题,它会替换外壳。

这应该适用于所有sh兼容的 shell。

编辑:pgrepBSD 系统(OS X,OpenBSD,...)上的实现有一个-q选项可以让它丢弃任何输出,但pgrepLinux 上显然没有这个标志。在 BSD 系统上,使用这个而不是稍微难看的重定向到/dev/null.