百分号%在“ kill%vmtouch”中起什么作用?

时间:2019-03-29 16:35:30

标签: shell

我遇到了这个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错误。

2 个答案:

答案 0 :(得分: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,该变量可以用作

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

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

答案 1 :(得分:2)

%something不是通用的Shell脚本功能,而是killfgbg内置命令用来标识作业的语法。它会在外壳程序的活动作业列表中搜索给定的字符串,然后发出信号。

这里man bash搜索/jobspec

  

字符%引入作业规范(jobspec)。          作业编号n可以称为%n。作业也可以使用启动作业的名称前缀或使用命令行中出现的子字符串来引用。 [...]

因此,如果您这样做:

sleep 30 &
cat & 

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