tcsh shell中获取后台进程正确pid遇到问题如何解决
tcsh后台进程PID获取异常修复方案
异常根因
该问题是Windows环境下tcsh运行exe程序的默认机制导致的:tcsh启动外部exe时会先fork一个子csh进程,再由这个子进程加载目标exe程序,所以内置变量$!返回的是中间层csh子进程的PID,而非目标my_program.exe的真实PID。
修复方法
方案1:添加
exec前缀启动后台进程(推荐)
加exec后子csh进程会直接替换为目标exe的进程镜像,不会保留中间csh进程,此时$!返回的就是目标进程PID,用法如下:exec my_program.exe & echo $!方案2:通过进程列表过滤抓取目标PID
如果你需要额外校验进程启动结果,或者存在多进程重名需要筛选的场景,可以直接拉取进程列表过滤得到真实PID:my_program.exe & set target_pid = `ps -W | grep 'my_program.exe' | awk '{print $1}'` echo $target_pid注:
ps -W是Cygwin/MSYS2等Windows兼容层tcsh的专有参数,可以列出所有Windows原生进程,如果有多个同名进程,可在grep中追加启动路径、启动参数等条件做精准筛选。
注意事项
非Windows环境下的tcsh不存在该中间层进程问题,原生
$!可以直接返回后台进程PID,不需要额外修改。
内容的提问来源于stack exchange,提问作者alon
相关产品推荐
相关产品推荐

