2012-06-14 48 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。如果您仍然没有获得正确的权限,请检查节点是否有选项来更改该权限。