免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 93237984
打印 上一主题 下一主题

shell的困惑 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-04-06 11:41 |只看该作者
原帖由 shitou9000 于 2006-4-6 11:12 发表
当sh processctl时。父shell会起一个进程子shell名字就是processctl,你做
ps -ef|grep -w $procname|grep -v "grep"|wc -l
就会发现有一个 processctl存在。
而你在#下敲的命令就在父shell中执行, ...


每次的进程号确实是不一样的,但我直接执行ps -ef|grep -w processctl|grep -v "grep"|wc -l返回的始终是0。而且为什么加上这个判断以后就查看不到sh processctl这个进程纪录了呢?以前没有做进程重复判断的时候我启动processctl后查看进程是可以看到下面2条的:
% ps -fu dload|grep ftp1momtlog
   test 1122322 1040532   0 11:39:52  pts/4  0:00 grep processctl
   test 1261782       1   0   Apr 03      -  3:26 sh processctl

应该怎么解决这个问题?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
22 [报告]
发表于 2006-04-06 12:25 |只看该作者
如果直接执行脚本的话,脚本的名字是不会出现在进程列表中的。因为脚本本身并不是一个进程,可以说脚本中的每一条外部命令都是一个单独的进程。所以这时你当然ps不到脚本名。
“sh 脚本名”时情况有所不同,这时实际上是调用了脚本解释程序sh,脚本名是调用时的命令行参数。而sh是一个二进制程序,是一个单独的进程,所以你能ps到。作为副产品,你同时也得到了作为命令行参数的脚本名。

论坛徽章:
0
23 [报告]
发表于 2006-04-06 12:56 |只看该作者
“创建文件processctl如下”

把你的shell脚本的名字processctl 改掉,不要和你需要检测的脚本的名字相同


创建脚本 a.sh 内容和processctl脚本内容相同,然后在执行 a.sh来检测 进程processctl是否在运行即可

论坛徽章:
0
24 [报告]
发表于 2006-04-06 13:08 |只看该作者
[quote]原帖由 woodie 于 2006-4-6 12:25 发表
如果直接执行脚本的话,脚本的名字是不会出现在进程列表中的。因为脚本本身并不是一个进程,可以说脚本中的每一条外部命令都是一个单独的进程。所以这时你当然ps不到脚本名。/quote]

我用%sh processctl启动进程,在另外一个终端ps是可以查到一个sh processctl进程的。
但返回的$ifrunning的值是2,这个2是不是包含processctl以及它的子进程?
如果我要控制进程重复是不是应该判断当$ifrunning的值大于2时说明进程已经启动,如果小于2说明该进程以前未启动。

论坛徽章:
0
25 [报告]
发表于 2006-04-06 13:19 |只看该作者
原帖由 vahala3 于 2006-4-6 12:56 发表
“创建文件processctl如下”

把你的shell脚本的名字processctl 改掉,不要和你需要检测的脚本的名字相同


创建脚本 a.sh 内容和processctl脚本内容相同,然后在执行 a.sh来检测 进程processctl是否在运行即可


这种方法确实可以检测到processctl是否在运行,但实际应用中是要限制进程的重复启动而不是检测,就是不能执行else后面的"start!"操作。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
26 [报告]
发表于 2006-04-06 13:26 |只看该作者
如果有pgrep的话,建议使用,计数不会出现错误。
如果没有,计数时要记得排除grep命令本身。
ps -ef | grep processctl | grep -v processctl | wc -l
或者有一种简单的写法:
ps -ef | grep [p]rocessctl

直接由计数>=2判断并不可靠,因为有时grep进程会没有被ps列出。

论坛徽章:
0
27 [报告]
发表于 2006-04-06 13:36 |只看该作者
原帖由 woodie 于 2006-4-6 13:26 发表
如果有pgrep的话,建议使用,计数不会出现错误。
如果没有,计数时要记得排除grep命令本身。
ps -ef | grep processctl | grep -v processctl | wc -l
或者有一种简单的写法:
ps -ef | grep [p]rocessctl

...


我这没有pgrep的。还有
ps -ef | grep processctl | grep -v processctl | wc -l应该是
ps -ef | grep processctl | grep -v "grep"| wc -l 吧!

如果不用大于2作为判断条件,兄弟认为应该怎样较好?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
28 [报告]
发表于 2006-04-06 13:45 |只看该作者
原帖由 93237984 于 2006-4-6 13:36 发表
...
ps -ef | grep processctl | grep -v processctl | wc -l应该是
ps -ef | grep processctl | grep -v "grep"| wc -l 吧!

如果不用大于2作为判断条件,兄弟认为应该怎样 ...

不好意思,笔误了。
说“*直接*由计数>=2判断并不可靠”,是指grep processctl命令本身可能被ps -ef列出,但有时候也可能不会列出,所以没有排除grep进程本身以前就做计数是不可靠的。

论坛徽章:
0
29 [报告]
发表于 2006-04-06 13:58 |只看该作者
原帖由 woodie 于 2006-4-6 13:45 发表

不好意思,笔误了。
说“*直接*由计数>=2判断并不可靠”,是指grep processctl命令本身可能被ps -ef列出,但有时候也可能不会列出,所以没有排除grep进程本身以前就做计数是不可靠的。


这句:ps -ef|grep -w $procname|grep -v "grep"|wc -l 不是已经排除了grep进程本身吗?
下面是我不断执行sh processctl的结果,有时候返回的值是2,有时候又是1,这应该跟grep   processctl没关系吧?为什么会出现这种情况呢?
% sh processctl
630958
2
Shell is running!
% sh processctl
1138876
2
Shell is running!
% sh processctl
909532
1
Shell is running!
% sh processctl
1138906
1
Shell is running!
% sh processctl
909344
2
Shell is running!


附脚本:
procname=processctl

ifrunning=`ps -ef|grep -w $procname|grep -v "grep"|wc -l`
echo $$

echo $ifrunning
if [ $ifrunning != 0 ]; then  
  echo "Shell is running!"
  sleep 10
  exit
else
  echo "Start!"
  sleep 10
fi

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
30 [报告]
发表于 2006-04-06 14:17 |只看该作者
原帖由 woodie 于 2006-4-6 12:25 发表
如果直接执行脚本的话,脚本的名字是不会出现在进程列表中的。因为脚本本身并不是一个进程,可以说脚本中的每一条外部命令都是一个单独的进程。所以这时你当然ps不到脚本名。
“sh 脚本名”时情况有所不同,这时 ...


如果是用fork加载的话,当然会产生一个进程, ps命令是否会列出是另一码事

  1. [waker@proxy dd3]$ echo $$
  2. 22676
  3. [waker@proxy dd3]$ cat t.sh
  4. #!/bin/bash
  5. echo $$
  6. cat /proc/$$/cmdline
  7. [waker@proxy dd3]$ ./t.sh
  8. 24583
  9. /bin/bash./t.sh[waker@proxy dd3]$
复制代码


注意两个进程号的不同
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP