【问题标题】:What does percent sign % do in "kill %vmtouch"?百分号 % 在“kill %vmtouch”中有什么作用?
【发布时间】:2019-03-30 00:55:07
【问题描述】:

我遇到了这个shell script

bash# while true; do
  vmtouch -m 10000000000 -l *head* & sleep 10m
  kill %vmtouch
done

想知道kill %vmtouch 部分是如何工作的?

我通常会传递一个 pid 来杀死一个进程,但是 %vmtouch 如何解析为一个 pid?

我尝试单独运行部分脚本,但我得到了 -bash: kill: %vmtouch: no such job 错误。

【问题讨论】:

  • 因上下文而异; ${var%suffixpat},f/e,有些不同。一个标识该上下文的标题会更好;乍一看原始标题,人们可能会认为这是percent symbol in bash: What's it used for?的众多重复之一

标签: shell


【解决方案1】:

%something 不是一般的 shell 脚本功能,而是 killfgbg 内置命令用来识别作业的语法。它在 shell 的活动作业列表中搜索给定的字符串,然后发出信号。

这里是man bash 搜索/jobspec

字符 % 介绍了一个工作规范(jobspec)。 作业号 n 可以称为 %n。 也可以使用用于启动它的名称前缀或使用出现在其命令行中的子字符串来引用作业。 [...]

如果你这样做:

sleep 30 &
cat & 

您可以使用 %sleep%sl 之类的东西方便地引用最后一个,而无需查找或记住其 pid 或作业号。

【讨论】:

    【解决方案2】:

    您应该查看man bash 页面的作业控制部分。角色% 介绍了一个工作规范(jobspec)。理想情况下,当您启动此后台作业时,您应该在终端中看到一个条目

    [1] 25647
    

    25647 是我使用的一些随机数。上一行表示最后一个后台作业的进程 id(在管道上,最后一个进程的进程 id)使用的作业号为 1

    在您的情况下,您使用作业规范的方式是错误的,因为它确实采用后台作业的进程名称。最后一个后台被称为%1,所以理想情况下你的kill命令应该写成如下,这和写kill 25647是一样的

    vmtouch -m 10000000000 -l *head* & sleep 10m
    kill %1 
    

    但也就是说,您可以访问后台作业的进程 ID,而不是依赖作业规范 ID,该进程 ID 存储在一个特殊的 shell 变量 $! 中,您可以将其用作

    vmtouch -m whatever -l *head* & vmtouch_pid=$!
    sleep 10m
    kill "$vmtouch_pid"
    

    请参阅 GNU bash 手册页中的 Job Control Basics

    【讨论】:

      猜你喜欢
      • 2011-11-16
      • 2015-04-02
      • 1970-01-01
      • 2017-10-24
      • 2023-03-16
      • 2018-12-08
      • 2013-04-20
      • 2012-09-02
      相关资源
      最近更新 更多