我遇到了这个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
错误。
答案 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脚本功能,而是kill
,fg
和bg
内置命令用来标识作业的语法。它会在外壳程序的活动作业列表中搜索给定的字符串,然后发出信号。
这里man bash
搜索/jobspec
:
字符%引入作业规范(jobspec)。 作业编号n可以称为%n。作业也可以使用启动作业的名称前缀或使用命令行中出现的子字符串来引用。 [...]
因此,如果您这样做:
sleep 30 &
cat &
您可以使用%sleep
或%sl
之类的东西方便地引用最后一个,而不必查找或记住其pid或工作编号。