免费注册 查看新帖 |

Chinaunix

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

[系统管理] 如何判断shell是否在运行(包括sleep状态)? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-10 12:56 |只看该作者 |倒序浏览
crontab指定每日运行一次shell A,
shell A中会扫描某目录下的文件进行处理,如果存在该文件,处理完成后shell退出,不影响第二天crontab
如果该目录一直不存在该文件,则shell  sleep 300后再次尝试,一直循环。

如果到第二日crontab执行时,前一日的shell恰逢sleep期间,这时怎么判断该shell在运行?

目前采用的 if test $(ps -ef | grep A |grep -v grep | wc -l)  -eq 0,但发现不起作用,sleep的时候进程名就变成sleep 300了,这句话就不生效了。

有没有合适的解决方法?

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
2 [报告]
发表于 2014-07-10 13:33 |只看该作者
没太看懂,
提供个思路看看行么
运行touch 一个pid,下次存在就退出,不存在就运行,运行完毕rm -f pid

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
3 [报告]
发表于 2014-07-10 14:10 |只看该作者
本帖最后由 q1208c 于 2014-07-10 16:43 编辑

楼主的问题是典型的单进程shell.

如果为了安全, 可以试试下面的做法.
1. pidfile, 在脚本运行时生成, 结束时删除. 如果有pidfile, 说明脚本可能在执行. "可能", 是因为如果脚本是被kill, 或异常退出的, pidfile 可能没有正确删除.
2. 如果pidfile存在, 读取 pid, 判断该pid是否存在, 如果 pid 不存在, 说明进程已经结束(可能正常, 也可能是被kill).
3. 如果pid存在, 读取 /proc/<pid>/cmd, 判断是否是同一个脚本, 因为pid可能会重复的.

我以前还用了 lockfile, 刚才想想, 觉得 pidfile 应该可以代替lockfile了.

----
看了上面兄弟的回复, 忽然想到,我为啥要用两个文件了, 一个 pidfile, 一个 lockfile, 是为了防止文件被误删除.

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
4 [报告]
发表于 2014-07-10 15:40 |只看该作者
好方法啊,学习了

论坛徽章:
0
5 [报告]
发表于 2014-07-10 16:47 |只看该作者
回复 3# q1208c

记得以前和谁争过lockfile的问题……
误删除这种事,总觉得是防不住的。

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
6 [报告]
发表于 2014-07-10 16:56 |只看该作者
回复 5# 用户名注册后不能更改

所以才有两个文件, 一个 pid, 一个lock. 这样, 误删的概率小一点.
   

论坛徽章:
0
7 [报告]
发表于 2014-07-10 22:37 |只看该作者
回复 6# q1208c


    lock和pid的思路是什么?

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
8 [报告]
发表于 2014-07-11 08:14 |只看该作者
回复 7# yyg747

如果你机器上有 rpm 包安装的 httpd, 你可以看一下 /etc/init.d/httpd 这个脚本. 这里有 pid, 有 lock.

只不过, 它好象并没有判断 pid 里是不是 apache, 这一点, 我确认过, 只要相同的pid存在, 新的apache 就不会启动.
所以, 我才在自己写的时候, 一定要读到 /proc/<pid>/cmd, 已确认是同一个进程.
   

论坛徽章:
0
9 [报告]
发表于 2014-07-11 11:22 |只看该作者
回复 8# q1208c

init.d中的各种例子确实经典。
不过我好像从来没有仔细读过- -

论坛徽章:
0
10 [报告]
发表于 2014-07-16 10:46 |只看该作者
#!/bin/bash
while true
do
        if (ps -fe |grep "sleep 1111"|grep -v grep)
        then
                sleep 10
        else
                (sleep 1111)&
        fi
done
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP