2012-06-14 77 views
1

我正在創建一個bash腳本,它將在後臺運行一個進程,從而創建一個套接字文件。套接字文件然後需要是chmod'd。我遇到的問題是,在嘗試chmod文件之前沒有創建套接字文件。在後臺啓動進程並從bash腳本中修改

示例源:

#!/bin/bash 

# first create folder that will hold socket file 
mkdir /tmp/myproc 
# now run process in background that generates the socket file 
node ../main.js & 
# finally chmod the thing 
chmod /tmp/myproc/*.sock 

如何延緩chmod的執行套接字文件被創建後,直到?

+0

只是一個想法,不知道它是否有效:在創建套接字時,不能從main.js發出信號,另一方面,在腳本中等待,直到收到該信號爲止? – DonCallisto

+0

可能是一種可能性,但我不確定這是如何在bash中構造的。 –

+0

您是否嘗試使用基於* inotify *的[工具](https://github.com/rvoicilas/inotify-tools/wiki/#wiki-info)在創建文件時保留選項卡? – dirkgently

回答

1

測試,看看文件,然後再繼續存在:

while [[ ! -e filename ]] 
do 
    sleep 1 
done 
+0

如果我想檢查與特定模式匹配的特定數量的文件,該怎麼辦? (例如。只有當有5個文件匹配'mysock [0-9] .sock'時才繼續) –

+0

@TrevNorris:使用帶有glob的數組並檢查數組元素的數量:'shopt -s nullglob;而a =(mysock {0..9} .sock); (($ {#a [@]} <5));做睡1;完成' –

+0

主要工作。必須將'(mysock {0..9} .sock)'改爲'(/tmp/myproc/mysock*.sock)'。但這是一個相當惡劣的技巧來顯示數組元素的數量。 –

2

我知道這樣做最簡單的方法是忙着等待文件出現。方便地,ls當它被要求列出的文件不存在時返回非零;所以只需在ls上循環,直到它返回0,並且當它發生時,您知道至少有一個*.sock文件用於chmod。

#!/bin/sh 
echo -n "Waiting for socket to open.." 
(while [ ! $(ls /tmp/myproc/*.sock) ]; do 
    echo -n "." 
    sleep 2 
done) 2> /dev/null 
echo ". Found" 

如果這是你需要做的不止一次包裝它在一個函數,但作爲應該做的,你應該做你需要的東西。

編輯:

正如指出的評價,使用LS這樣差在測試中-e,所以下面的重寫腳本是優選的。 (我還糾正了shell調用,如-n不支持在SH仿真模式的所有平臺)。

​​3210
+1

不,循環'[[-e文件名]]'。 'ls'不是必需的,不是爲此目的而設計的。您沒有重定向它將輸出的錯誤消息 - 而是將所有可能的錯誤丟棄在無用的子shell中(如果必須,請使用大括號)。沒有必要使用方括號和命令替換,因爲'if'可以測試返回值,如果一個命令(這是''''這是一個命令),包括用'!'否定它。 –

+0

特別是因爲你說你要測試返回值,當你使用方括號和命令替換時你真的在做什麼時,它會測試'ls'輸出的文本。 –

+0

@丹尼斯威廉姆森你是對的,我很粗心。我編輯過,以包含您的建議改進。謝謝。 – Recurse

1

如果您設置你的umask(嘗試umask 0)你可能根本不需要chmod。如果您仍然沒有獲得正確的權限,請檢查節點是否有選項來更改該權限。