我试图理解@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 的最佳方法是什么?
$$
是当前 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 人闲逛。