RHEL 7.4中bash循环内ps命令输出不一致问题求助
为啥后台sleep进程的ps输出一会儿是sleep 1,一会儿是-bash?
这事儿得从bash执行外部命令的底层流程说起,再加上系统调度的“随机性”就好理解了:
bash跑外部命令的两步走
你脚本里的sleep是RHEL7.4里的外部命令(/bin/sleep),bash要启动它得拆成两步:- 先
fork一个子进程:这时候子进程完全继承bash的“身份”,命令行显示的就是-bash(和你的登录shell标识一致)。 - 再让子进程
execve加载sleep程序:这一步完成后,子进程才真正变成sleep 1进程,命令行也会更新成sleep 1。
- 先
调度顺序搞的鬼
这两步之间有个极短的时间窗口:- 大多数时候,子进程会抢在脚本执行
ps之前完成execve,所以ps查到的就是正常的sleep 1。 - 偶尔系统调度器会“偏心”,让脚本的父进程先跑,
ps命令在子进程还没来得及切换成sleep的时候就查了PID,这时候看到的就是还没“变身”的bash子进程,也就是-bash。
- 大多数时候,子进程会抢在脚本执行
为啥作业完成消息都是sleep 1?
因为bash从一开始就知道它启动这个后台任务是要跑sleep 1,不管子进程有没有来得及完成变身,只要它退出了,bash就会如实告诉你“这个sleep任务完成了”。
内容的提问来源于stack exchange,提问作者Ulli
相关产品推荐
相关产品推荐

