1

我正在创建一个 bash 脚本,它将在后台运行一个进程,该进程创建一个套接字文件。然后需要对套接字文件进行chmod'd. 我遇到的问题是在尝试文件之前没有创建套接字chmod文件。

示例来源:

#!/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直到创建套接字文件之后?

4

3 回答 3

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 调用,因为在 sh 仿真模式下并非所有平台都支持 -n。)

#!/bin/bash
echo -n "Waiting for socket to open.."
while [ ! -e /tmp/myproc/*.sock ]; do
  echo -n "."
  sleep 2
done
echo ". Found"
于 2012-06-14T07:22:32.493 回答
1

在继续之前测试以查看文件是否存在:

while [[ ! -e filename ]]
do
    sleep 1
done
于 2012-06-14T11:23:07.330 回答
1

如果您设置了umask(尝试umask 0),您可能根本不需要 chmod。如果您仍然没有获得正确的权限,请检查节点是否具有更改权限的选项。

于 2012-06-15T01:30:17.503 回答