[問題] 如何等到檔案出現後才執行另外的程式

看板Linux作者 (andy)時間8年前 (2016/06/06 16:40), 編輯推噓9(9050)
留言59則, 11人參與, 最新討論串1/1
各位板上先進好 目前手邊有個shell script不知如何寫,想請教各位 問題:目前我執行第一個程式,它會產生A file及B file(兩個file產生的時間不同), 我需要等待兩個file都產生之後才能執行第二個程式,想請教該如何寫 不曉得是否要用到每隔一段時間就檢查一遍兩個file是否產生 謝謝^^ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.205.229 ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1465202420.A.E14.html

06/06 17:24, , 1F
我記得有函數可以用
06/06 17:24, 1F

06/06 17:46, , 2F
用 make 或者是其他類似的工具,可以設定執行順序
06/06 17:46, 2F

06/06 18:19, , 3F
為何不在第一個程式執行完才呼叫第二個?
06/06 18:19, 3F

06/06 18:53, , 4F
兩個檔案都是程式執行完才會產生的
06/06 18:53, 4F

06/06 20:44, , 5F
用返回值來判定?
06/06 20:44, 5F

06/06 23:49, , 6F
最簡單的方式就是用 ls find 之類的東西去判斷檔案存在
06/06 23:49, 6F

06/06 23:49, , 7F
與否 都存在再繼續 run 就好
06/06 23:49, 7F

06/06 23:51, , 8F
但是這種敘述應該就跟3F一樣的方式就可以了吧
06/06 23:51, 8F

06/07 09:55, , 9F
判斷檔案存在的個數 = 2 就可以執行下一個程式
06/07 09:55, 9F

06/07 10:05, , 10F
google inotify
06/07 10:05, 10F

06/07 19:30, , 11F
推樓上正解
06/07 19:30, 11F

06/07 23:53, , 12F
我再嘗試b大所說的看能不能成功
06/07 23:53, 12F

06/08 06:58, , 13F
[ -f AFILE -a -f BFILE ] && PROG2 ?
06/08 06:58, 13F

06/08 11:28, , 14F
inotify在/usr/local/bin底下找不到,似乎不能使用
06/08 11:28, 14F

06/08 11:34, , 15F
inotify 是統稱,有分system call以及binary utility,你要
06/08 11:34, 15F

06/08 11:35, , 16F
用在shell script.請看man inotify的SEE ALSO裏面括號標
06/08 11:35, 16F

06/08 11:35, , 17F
示為(1)的
06/08 11:35, 17F

06/08 13:05, , 18F
在SEE ALSO裡面只有括號標示為2的
06/08 13:05, 18F

06/08 13:06, , 19F
inotify_add_watch(2),inotify_init(2)...後面都是2
06/08 13:06, 19F

06/08 13:13, , 20F
系統內有沒有 inotifywait 和 inotifyatch?
06/08 13:13, 20F

06/08 13:16, , 21F
inotifywatch
06/08 13:16, 21F

06/08 13:27, , 22F
你指的系統內是指在/usr/local/bin底下嗎?底下都無
06/08 13:27, 22F

06/08 13:31, , 23F
我看到google有人在cshell使用inotifywait,他就是從
06/08 13:31, 23F

06/08 13:32, , 24F
/usr/local/bin/inotifywait去呼叫,但我去使用linux
06/08 13:32, 24F

06/08 13:33, , 25F
都會回覆command not found.感覺系統沒安裝
06/08 13:33, 25F

06/08 13:47, , 26F
以我用的ubuntu 14.04為例是安裝inotify_tools套件,執行
06/08 13:47, 26F

06/08 13:47, , 27F
檔在 /usr/bin 下,你可能要看一下你的系統如何安裝
06/08 13:47, 27F

06/08 13:48, , 28F
inotify-tools
06/08 13:48, 28F

06/08 14:26, , 29F
b大 請問有程式執行完,系統休息5秒,再繼續run下個程式
06/08 14:26, 29F

06/08 14:27, , 30F
的command嗎? 謝謝
06/08 14:27, 30F

06/08 16:13, , 31F
man sleep
06/08 16:13, 31F

06/08 17:43, , 32F
sleep我有用過他是一開始就啟動了,並不是程式執行完
06/08 17:43, 32F

06/08 17:44, , 33F
才啟動,不曉得有無方法
06/08 17:44, 33F

06/08 17:57, , 34F
不懂意思,不是script裏面某命令A完成要等5秒後再繼續命令
06/08 17:57, 34F

06/08 17:58, , 35F
B,A和B中間就加sleep. 看不懂你所想表達的意思
06/08 17:58, 35F

06/08 19:49, , 36F
原 po 跑的程式是會強制送背景嗎?
06/08 19:49, 36F

06/08 19:53, , 37F
而且萬一檔案剛建立東西還沒寫入,第二個程式就起來怎麼辦
06/08 19:53, 37F

06/08 20:25, , 38F
要確保檔案全部產生完成才進行下一步,可以先產生暫時檔名
06/08 20:25, 38F

06/08 20:26, , 39F
,等寫檔完成關檔後,執行檔案改名(假設為F),inotify則監視
06/08 20:26, 39F

06/08 20:26, , 40F
F檔案產生才進行下一個程式
06/08 20:26, 40F

06/08 20:55, , 41F
應該是我執行的程式都在背景跑,所以sleep才一起動作
06/08 20:55, 41F

06/08 20:56, , 42F
照這樣在背景執行的話似乎就沒辦法用sleep
06/08 20:56, 42F

06/08 20:57, , 43F
還是可以,我不知道你的整個流程,不過你需要一個監管程式
06/08 20:57, 43F

06/08 20:57, , 44F
負責在適當的時間執行該被執行的程式,等待5秒是由這個監
06/08 20:57, 44F

06/08 20:58, , 45F
管程式負責等,等5秒後再背景執行下個程式
06/08 20:58, 45F

06/08 20:58, , 46F
如果依本文一開始說的要2個檔案都完成再進行下一步,假設
06/08 20:58, 46F

06/08 20:59, , 47F
這[下一步]開始之前要等5秒,那就是監管程式用inotifywait
06/08 20:59, 47F

06/08 20:59, , 48F
現在的目的是程式在背景執行,執行完等待5秒再執行第2
06/08 20:59, 48F

06/08 20:59, , 49F
監視2個檔案都完全產生了,由監管程式sleep等5秒後再執行
06/08 20:59, 49F

06/08 20:59, , 50F
[下一步]
06/08 20:59, 50F

06/08 21:00, , 51F
個程式在背景 看各位不知有無解決的方法 謝謝
06/08 21:00, 51F

06/08 21:01, , 52F
看來可以用我上面推文的作法,總之就是你需要一個監管程式
06/08 21:01, 52F

06/08 21:01, , 53F
由它負責在正確的時機背景執行下個要執行的程式
06/08 21:01, 53F

06/08 21:27, , 54F
感覺寫成背景服務比較萬無一失
06/08 21:27, 54F

06/08 21:38, , 55F
應該可以先 wait A 再直接跑 B。如果 A 會結束的話 XD
06/08 21:38, 55F

06/08 21:40, , 56F
如果 A 結束表示東西都有正常產出的話就用 wait 吧
06/08 21:40, 56F

06/08 21:49, , 57F
最後是根據我吐出的log關鍵字去執行第2個程式
06/08 21:49, 57F

06/09 01:08, , 58F
看起來用一隻程式去做 :先執行A丟背景執行 然後就w
06/09 01:08, 58F

06/09 01:08, , 59F
ait. 再用if確認有檔案的話 在執行B不就好了?XD
06/09 01:08, 59F
文章代碼(AID): #1NLJRquK (Linux)