$$ 和 $! 和有什么不一样?使用 /bin/bash -c 时

got*_*osh 3 php bash

我试图理解@sysfault 在此评论中的“oneliner” :

/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &

我尝试了以下变化......

不同的 $$ 内外:

/bin/bash -c 'echo $$ && exec sleep 5' ; echo $$
14408
29700
Run Code Online (Sandbox Code Playgroud)

相同的pid(但在后台):

$ /bin/bash -c 'echo $$ && exec sleep 5' & echo $! 
[1] 8309
8309
$ 8309

[ 1 ]+  Done  /bin/bash -c 'echo $$ && exec sleep 5'
Run Code Online (Sandbox Code Playgroud)

$$ 和 $ 的不同 pid!:

/bin/bash -c 'echo $$ && exec sleep 5 & echo $!'                                 
6504
6503
Run Code Online (Sandbox Code Playgroud)

Kill 不工作:/bin/bash -c 'echo $$ && (sleep 15 ; echo done)'
19063 Killed $ done (echo 在 kill 后出现)

与访问前台进程的 pid 相同的 pid:

$ /bin/bash -c 'echo > tmp.pid ; sleep 10 ; echo $$ ; echo done ; echo $$;'      
28415 (instantly)
28415 (10 seconds later)
done
28415
$ cat tmp.pid 
28415
Run Code Online (Sandbox Code Playgroud)

使用此命令,我能够在睡眠完成之前终止另一个窗口中的 pid - 防止发生最后三个回声:

$ /bin/bash -c 'echo $$ ; sleep 30 ; echo $$ ; echo done ; echo $$;'               
23236
Killed
Run Code Online (Sandbox Code Playgroud)

上下文:最终我想通过 php exec() 启动 bash 进程,并在继续之前等待结果保存 pid 以便我可以在按下手动取消按钮时进行清理。我将处理 2 个昂贵的进程:一个 rsync 和一个 git commit & push。

可靠地获取包含多个命令(使用 ; > | 或 &&)的前台 bash 脚本的 pid 的最佳方法是什么?

gle*_*man 7

$$当前 shell的 PID 。当您在bash -c脚本正文中使用 $$ 时,您将获得该生成的 shell的 pid

$ echo $$; bash -c 'echo $$'; echo $$
6872
6987
6872
Run Code Online (Sandbox Code Playgroud)

$!最后一个后台进程的PID

$ sleep 5 & echo $!; sleep 5 & echo $!; echo ===; pgrep -l sleep
[1] 7118
7118
[2] 7119
7119
===
7118 sleep
7119 sleep
Run Code Online (Sandbox Code Playgroud)

当你这样做时bash -c 'echo $$' & echo $!,你会得到两次打印相同的pid,因为对于你当前的shell,$! 是后台 bash 进程的 pid,在脚本主体内,$$ 是同一后台 bash 进程的当前 pid。

当你这样做时/bin/bash -c 'echo $$ && exec sleep 5 & echo $!',你会得到两个不同的 pid:$$ 是 bash 进程的 pid 和 $! 是睡眠进程的pid。

  • 我觉得这很奇怪,因为您正在使用,exec所以它应该是相同的 PID(睡眠进程替换了 bash 进程)
  • 但是,您正在使用,exec ... &因此 bash 必须首先派生一个子外壳来运行后台任务,然后 exec用睡眠替换该子外壳

您的实际问题的答案最好由 php 人员回答,而我不是。您应该向版主标记这个问题,并请求将其移至 Stack Overflow,在那里肯定会有更多的 php 人闲逛。