免费注册 查看新帖 |

Chinaunix

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

[系统管理] dbus-monitor, 脚本莫名运行2次 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-18 09:38 |只看该作者 |倒序浏览
我想在screenlock和screenunlock的时候,运行一段脚本,使用dbus-monitor去等待信号,发现脚本被运行两次。
脚本test.sh
  1.   1 #! /bin/bash
  2.   2
  3.   3 echo $PWD
  4.   4
  5.   5 #dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
  6.   6 #(
  7.   7 while true;
  8.   8 do
  9.   9     sleep 3
  10. 10 done
  11. 11 #)  
复制代码
运行,并使用ps+grep:
$ps -aux | grep "test.sh"
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
1488474421 3599 0.0  0.0  16508  1412 pts/6    S+   09:28   0:00 /bin/bash ./test.sh
1488474421 3617 0.0  0.0  13576   944 pts/3    S+   09:28   0:00 grep --color=auto test.sh
./test.sh只有一次
但是当打开test脚本的注释,变成:
  1.   1 #! /bin/bash
  2.   2
  3.   3 echo $PWD
  4.   4
  5.   5 dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |                                                                                                           
  6.   6 (
  7.   7 while true;
  8.   8 do
  9.   9     sleep 3
  10. 10 done
  11. 11 )
复制代码
运行,并使用ps+grep,就变成了:
$ps -aux | grep "test.sh"
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
1488474421 2152 0.0  0.0  16512  1416 pts/6    S+   09:19   0:00 /bin/bash ./test.sh
1488474421 2154 0.0  0.0  16512   652 pts/6    S+   09:19   0:00 /bin/bash ./test.sh
1488474421 2158 0.0  0.0  13576   944 pts/3    S+   09:19   0:00 grep --color=auto test.sh

可以看出,脚本由有两个在运行,没有搞清楚这是为什么?对dbus-monitor不是非常熟悉,什么原因导致的?

论坛徽章:
0
2 [报告]
发表于 2014-02-18 10:40 |只看该作者
回复 2# rdcwayx

是同一个父进程,并且子进程号 一直都是 相差2

我想请教的是:
我使用 ./test.sh 一次
为什么ps出来,会有两个进程在运行?

BTY: 使用kill命令,对这两个进程,结果是不一样的
1. kill (第一个)   在另一个运行的terminal里面会显示:
$./test.sh
/home/aibing/user_own/office_recorder
Terminated
2. kill(第二个) 另一个运行的terminal里无反映,脚本正常运行


   

论坛徽章:
0
3 [报告]
发表于 2014-02-18 17:43 |只看该作者
本帖最后由 sewidking 于 2014-02-18 17:58 编辑

用()围起来的命令是在子shell中运行的,也就是你看到的第二个进程

kill第一个,kill掉的是整个脚本,所以sleep就被Terminated了
kill第二个,kill掉的是死循环其中的一个sleep,死了一个sleep还有千千万万个sleep,当然没反应了

另外说一句,aux前面不用加-
while后面如果不用do,也没必要用;

论坛徽章:
0
4 [报告]
发表于 2014-02-19 10:07 |只看该作者
回复 4# sewidking

谢谢回复,还是有些不明白,请教
  1.   5 dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |                                                                                                           
  2.   6 #(
  3.   7 while true;
  4.   8 do
  5.   9     sleep 3
  6. 10 done
  7. 11 #)
复制代码
第五行的“|”通道字符, 和 第六行 第十一行 (),
1. 第五行的“|”管道字符,六,十一行“()”,全部注释掉,只有一个进程在运行
2. 打开第五行的“|”通字符,注释掉六,十一行“()”),存在两个进程运行
3. 注释掉第五行的“|”管道字符,打开六,十一行“()”,同样存在两个进程运行
4. 打开第五行的“|”管道字符,打开六,十一行“()”,同样也存在两个进程运行

也就是“|” 和 “()”, 都会多产生一个子进程。同时打开也仅仅会多产生一个子进程。

请问:
1. 这个时候是不是"|"的含义变了?但是我使用"\|",出错:Failed to setup match "|": Match rule has a key with no subsequent '=' character
2. 有没有办法不让()围起来的在子shell中运行呢?我希望只有一个shell脚本进程在运行。
3. 为什么()会产生一个子进程呢?关于此,可以推荐文档查看吗?

谢谢

   

论坛徽章:
0
5 [报告]
发表于 2014-02-19 12:18 |只看该作者
'|'在这里仍然是匿名管道,加上\之后成为dbus-monitor的一个参数

如果要使用()或者|,都会再产生一个进程,详情参考shell十三问

如果不需要并行执行,完全可以在dbus-monitor执行完之后在执行sleep循环,
去掉()和|,如有必要可以把()换成{}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP