免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3953 | 回复: 5
打印 上一主题 下一主题

如何判断shell本身只执行一个进程 和 如何获取执行shell的uid ? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-15 00:11 |只看该作者 |倒序浏览
需求事情是这样的:1个shell ,要求任一时刻shell自身最多只有1个进程运行 ;然后这个shell只能由一个用户执行。
shell 一开始运行就立刻自身做判断,如果发现不是指定用户运行的,退出;如果发现自己在其它地方已经在运行了,也退出。

保证它自身只有一个在运行下面的代码好像可以实现,但是我不敢肯定,因为不清楚为啥要 “$Pnum -ge 3”而不是 “$Pnum -ge 2 ” ,至于怎么获取shell的uid 我不会,高手帮帮忙~~~

#!/bin/bash

PN=`basename $0`
echo $PN
Pnum=`pgrep -f $PN|wc -l`

if [ $Pnum -ge 3 ]
then
        echo "I am running"
        exit 3
fi
# doing work
while true
do
        sleep 1
        echo "loopping....for.....test..........."
done

论坛徽章:
0
2 [报告]
发表于 2006-12-15 08:56 |只看该作者
获取用户UID:
  1. UID=`id -u $USER`
复制代码

或者直接:
  1. echo $UID
复制代码

我觉得“$Pnum -ge 3”是没有道理的
lol

论坛徽章:
0
3 [报告]
发表于 2006-12-15 12:44 |只看该作者
对的,判断用户使用$USER $UID都行,甚至土一点shell里直接用 whoami 再作判断也行,昨晚加班加傻了,一下没想到~~~

我调试的结果就是要 “$Pnum -ge 3” 才行 ,如果 “$Pnum -ge 2”的话那这个shell的循环部分永远得不到执行,就是这里想不通,可能和管道有关。有兴趣的XD不妨调调看

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2006-12-15 12:54 |只看该作者
子shell的问题,不光是管道,另外进程替换也会产生子shell。

论坛徽章:
0
5 [报告]
发表于 2009-05-21 15:38 |只看该作者

回复 #3 qpfei$ 的帖子

Pnum=`pgrep -f $PN|wc -l`
pgrep在做匹配时,由于CPU的时间片分布的随机性,有时候pgrep进程本身因为带关键字,所以也会被算进去,所以ne 3是比较保险的算法,我是这么理解的。

论坛徽章:
0
6 [报告]
发表于 2009-05-21 15:56 |只看该作者
是否需要考虑不同目录的同名shell的问题呢?
另外pgrep我觉得用-x参数比用-f参数更安全一些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP