免费注册 查看新帖 |

Chinaunix

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

[shell应用进阶]:限制同时运行脚本实例的个数 -- 串行化:换一个思路。  关闭 [复制链接]

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
31 [报告]
发表于 2006-10-12 22:57 |只看该作者
这样可以了,命名管道有点鬼,还没研究透。似乎在打开文件时就阻塞了,所以必须用读写模式打开。

  1. exec 9<>namedpipefile
  2. read -t1 <&9
复制代码

论坛徽章:
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
32 [报告]
发表于 2006-10-13 07:43 |只看该作者
to woodie&r007
1.挂在那里的原因是: read -t1命令根本没有被执行,命令一直处于准备 <namedpipe的状态,有兴趣的话先跑题讨论一下FIFO?

2.摸拟read -t的脚本实现以前也讨论过,我的思路是写一个read.sh,调用,在后台计时kill它就好了,这个不讨论了吧,没什么有价值的技巧

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
33 [报告]
发表于 2006-10-13 09:33 |只看该作者
呵呵,谢谢两位提示!这样做也可以:
read -t1 var <>$FIFO_NAME
不过read -t的兼容性还是差点。
自己处理倒没什么难度,我只是怕麻烦而已!^_^

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
34 [报告]
发表于 2006-10-13 09:54 |只看该作者
原帖由 waker 于 2006-10-13 07:43 发表
to woodie&r007
1.挂在那里的原因是: read -t1命令根本没有被执行,命令一直处于准备 <namedpipe的状态,有兴趣的话先跑题讨论一下FIFO?
...

waker兄说的对,实际上如果没有进程以写方式打开FIFO,FIFO对于任何读取操作都是不可用的(Not ready for read)。
像这样的话就没有问题:
sleep 20 > $FIFO_NAME&
read -t1 var < $FIFO_NAME
因为已经有进程以写方式打开了FIFO,虽然它暂时还没有写入任何内容,但read -t已经按我们的愿望运作正常了。

论坛徽章:
0
35 [报告]
发表于 2006-10-19 10:26 |只看该作者
看不太明白,还是来点实际的吧,reallink程序中有一个限制,就是只能在一台电脑中同时运行三个,能不能用你的理论,把它给破了?

论坛徽章:
0
36 [报告]
发表于 2006-10-21 01:57 |只看该作者
学习

论坛徽章:
0
37 [报告]
发表于 2006-10-26 15:04 |只看该作者
想个最简单的, 不知道可不可行:

脚本运行时直接把当前 进程的 PID 号 写到 如 /tmp/myscriptrun 文件里, 用 >> 加行

这样,脚本运行时先取得这个文件的最后几行,检查一下它的PID是否还存在,感觉这样也应该可以.

而且要控制只能运行 两个,或三个, 实例都可以,而且脚本自身改名了也能检测的到

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
38 [报告]
发表于 2006-10-26 15:40 |只看该作者
谢谢关注!append文件思路在楼顶加锁方法之3已经提出了。对于只允许一个进程的情况,这个锁机制工作的不错,但失效锁的问题仍然没有解决,即进程意外退出后其它进程得不到机会运行的问题。
对于允许多个进程的场合,有一个很大的问题,进程结束时应该改写或删除关键文件 -- 你的例子中是myscriptrun,但多个进程同时写一个文件的情况如何处理?这里就有潜在的race condition,怎么解决?再加锁?我们似乎掉入了一个怪圈,好像一只小狗不停地追逐自己的尾巴,却永远追不上.......^_^

论坛徽章:
0
39 [报告]
发表于 2006-10-29 09:23 |只看该作者
不妨看看这个程序,专为这个问题而编写
http://www.unixwiz.net/tools/lockrun.html

论坛徽章:
0
40 [报告]
发表于 2006-11-29 10:41 |只看该作者
没看太明白,刚学习shell
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP