在非root用户下,$$获取到的进程id和实际的id不一样

来源:6-1 函数定义和使用

逮虾乎

2019-03-02

下面是我的脚本
#!/bin/bash

this_pid=$$
ps -ef | grep nginx | grep -v grep | grep -v $this_pid

if [ $? -eq 0 ];then
echo "Nginx is running well"
else
systemctl start nginx
echo "Nginx is down,start it"
fi

在我将nginx服务停掉之后,执行上述脚本
[vagrant@docker-host shell]$ sudo bash -x nginx_daemon.sh

  • this_pid=9071
  • grep nginx
  • grep -v grep
  • grep -v 9071
  • ps -ef
    root 9069 8446 0 16:06 pts/0 00:00:00 sudo bash -x nginx_daemon.sh
  • ‘[’ 0 -eq 0 ‘]’
  • echo 'Nginx is running well’
    Nginx is running well

$$获取到的进程id和实际的id不一样

写回答

1回答

酷田

2019-03-03

执行sudo其实是以另外一个用户执行脚本,因此通过$$是无法获取到脚本所生成的子进程pid的!可以通过两种方法来规避,一种是将脚本命名成不包含nginx的脚本名,另一种方法是直接grep -v $0,直接将脚本名称过滤掉,也可以实现把执行脚本的进程排除掉的目的!您提的问题很好,我没发现,多谢多谢?

2
0

掌握Shell脚本编程 360架构师带你进阶Linux高手

30%知识讲解+70%实例操作 掌握Shell脚本编程能力

1638 学习 · 297 问题

查看课程