[问题] 如何等到档案出现后才执行另外的程式

楼主: andy433268 (andy)   2016-06-06 16:40:18
各位板上先进好
目前手边有个shell script不知如何写,想请教各位
问题:目前我执行第一个程式,它会产生A file及B file(两个file产生的时间不同),
我需要等待两个file都产生之后才能执行第二个程式,想请教该如何写
不晓得是否要用到每隔一段时间就检查一遍两个file是否产生
谢谢^^
作者: filiaslayers (司马云)   2016-06-06 17:24:00
我记得有函数可以用
作者: Neisseria (Neisseria)   2016-06-06 17:46:00
用 make 或者是其他类似的工具,可以设定执行顺序
作者: asilzheng (asil)   2016-06-06 18:19:00
为何不在第一个程式执行完才呼叫第二个?
楼主: andy433268 (andy)   2016-06-06 18:53:00
两个档案都是程式执行完才会产生的
作者: Bellkna (柔弱气质伪少女)   2016-06-06 20:44:00
用返回值来判定?
作者: chang505 (眼线)   2016-06-06 23:49:00
最简单的方式就是用 ls find 之类的东西去判断档案存在与否 都存在再继续 run 就好但是这种叙述应该就跟3F一样的方式就可以了吧
作者: pizzahut (...)   2016-06-07 09:55:00
判断档案存在的个数 = 2 就可以执行下一个程式
作者: bitlife (BIT一生)   2016-06-07 10:05:00
google inotify
作者: filiaslayers (司马云)   2016-06-07 19:30:00
推楼上正解
楼主: andy433268 (andy)   2016-06-07 23:53:00
我再尝试b大所说的看能不能成功
作者: lspci (awk sed echo)   2016-06-08 06:58:00
[ -f AFILE -a -f BFILE ] && PROG2 ?
楼主: andy433268 (andy)   2016-06-08 11:28:00
inotify在/usr/local/bin底下找不到,似乎不能使用
作者: bitlife (BIT一生)   2016-06-08 11:34:00
inotify 是统称,有分system call以及binary utility,你要用在shell script.请看man inotify的SEE ALSO里面括号标示为(1)的
楼主: andy433268 (andy)   2016-06-08 13:05:00
在SEE ALSO里面只有括号标示为2的inotify_add_watch(2),inotify_init(2)...后面都是2
作者: bitlife (BIT一生)   2016-06-08 13:13:00
系统内有没有 inotifywait 和 inotifyatch?inotifywatch
楼主: andy433268 (andy)   2016-06-08 13:27:00
你指的系统内是指在/usr/local/bin底下吗?底下都无我看到google有人在cshell使用inotifywait,他就是从/usr/local/bin/inotifywait去呼叫,但我去使用linux都会回复command not found.感觉系统没安装
作者: bitlife (BIT一生)   2016-06-08 13:47:00
以我用的ubuntu 14.04为例是安装inotify_tools套件,执行档在 /usr/bin 下,你可能要看一下你的系统如何安装inotify-tools
楼主: andy433268 (andy)   2016-06-08 14:26:00
b大 请问有程式执行完,系统休息5秒,再继续run下个程式的command吗? 谢谢
作者: bitlife (BIT一生)   2016-06-08 16:13:00
man sleep
楼主: andy433268 (andy)   2016-06-08 17:43:00
sleep我有用过他是一开始就启动了,并不是程式执行完才启动,不晓得有无方法
作者: bitlife (BIT一生)   2016-06-08 17:57:00
不懂意思,不是script里面某命令A完成要等5秒后再继续命令B,A和B中间就加sleep. 看不懂你所想表达的意思
作者: Bencrie   2016-06-08 19:49:00
原 po 跑的程式是会强制送背景吗?而且万一档案刚建立东西还没写入,第二个程式就起来怎么办
作者: bitlife (BIT一生)   2016-06-08 20:25:00
要确保档案全部产生完成才进行下一步,可以先产生暂时档名,等写档完成关档后,执行档案改名(假设为F),inotify则监视F档案产生才进行下一个程式
楼主: andy433268 (andy)   2016-06-08 20:55:00
应该是我执行的程式都在背景跑,所以sleep才一起动作照这样在背景执行的话似乎就没办法用sleep
作者: bitlife (BIT一生)   2016-06-08 20:57:00
还是可以,我不知道你的整个流程,不过你需要一个监管程式负责在适当的时间执行该被执行的程式,等待5秒是由这个监管程式负责等,等5秒后再背景执行下个程式如果依本文一开始说的要2个档案都完成再进行下一步,假设这[下一步]开始之前要等5秒,那就是监管程式用inotifywait
楼主: andy433268 (andy)   2016-06-08 20:59:00
现在的目的是程式在背景执行,执行完等待5秒再执行第2
作者: bitlife (BIT一生)   2016-06-08 20:59:00
监视2个档案都完全产生了,由监管程式sleep等5秒后再执行[下一步]
楼主: andy433268 (andy)   2016-06-08 21:00:00
个程式在背景 看各位不知有无解决的方法 谢谢
作者: bitlife (BIT一生)   2016-06-08 21:01:00
看来可以用我上面推文的作法,总之就是你需要一个监管程式由它负责在正确的时机背景执行下个要执行的程式
作者: Bellkna (柔弱气质伪少女)   2016-06-08 21:27:00
感觉写成背景服务比较万无一失
作者: Bencrie   2016-06-08 21:38:00
应该可以先 wait A 再直接跑 B。如果 A 会结束的话 XD如果 A 结束表示东西都有正常产出的话就用 wait 吧
楼主: andy433268 (andy)   2016-06-08 21:49:00
最后是根据我吐出的log关键字去执行第2个程式
作者: smallyou1988   2016-06-09 01:08:00
看起来用一只程式去做 :先执行A丢背景执行 然后就wait. 再用if确认有档案的话 在执行B不就好了?XD

Links booklink

Contact Us: admin [ a t ] ucptt.com