使用$!获取后台作业PID的Shell脚本是否存在Bug?
关于Shell脚本中$!获取后台进程PID的疑问
我写了一个Shell脚本,用来启动多个后台作业,并用$!把它们的进程ID(PID)存到数组里,最后打印所有PID。但我怀疑脚本有Bug——如果设备上有其他进程在创建,$!会不会返回其他进程的PID?
我的脚本代码如下:
#!/bin/bash ps -a & pids+=($!) #$!是否一定会返回ps -a命令的进程ID? ls -la & pids+=($!) #$!是否一定会返回ls -la命令的进程ID? echo ${pids[0]} echo ${pids[1]}
解答
你担心的这个Bug不存在,$!一定会准确返回对应后台命令的PID,原因如下:
- 在bash中,
$!是当前shell会话的内部变量,它只会记录当前shell刚刚启动的最后一个后台作业的PID,和系统中其他无关进程完全没关系。 - 你的写法
命令 & pids+=($!)执行顺序是严格绑定的:先把目标命令放到后台运行,shell会立刻将该进程的PID赋值给$!,紧接着就把$!的值加入数组。这个过程不会被外部进程干扰,因为$!的更新只和当前shell执行的后台命令挂钩。
只有当你在启动后台命令和读取$!之间插入了其他后台命令时,才会出现$!被覆盖的情况,但你的脚本里没有这种场景,所以完全没问题。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

