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

作者: 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