Linux 在后台启动进程并从bash脚本修改它

Linux 在后台启动进程并从bash脚本修改它,linux,bash,Linux,Bash,我正在创建一个bash脚本,它将在后台运行一个进程,从而创建一个套接字文件。然后需要对套接字文件进行chmod。我遇到的问题是,在尝试对文件进行chmod之前,没有创建套接字文件 示例来源: !/bin/bash 首先创建将保存套接字文件的文件夹 mkdir/tmp/myproc 现在在后台运行生成套接字文件的进程 节点../main.js& 终于搞定了 chmod/tmp/myproc/*.sock 如何将chmod的执行延迟到创建套接字文件之后?我知道的最简单的方法是忙着等待文件出现。方便的

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

示例来源:

!/bin/bash 首先创建将保存套接字文件的文件夹 mkdir/tmp/myproc 现在在后台运行生成套接字文件的进程 节点../main.js& 终于搞定了 chmod/tmp/myproc/*.sock
如何将chmod的执行延迟到创建套接字文件之后?

我知道的最简单的方法是忙着等待文件出现。方便的是,当要求ls列出的文件不存在时,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"
如果这是您需要多次执行的操作,请将其包装到函数中,否则as is应该执行您需要的操作

编辑:

正如在评论中指出的,在测试中使用像这样的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"

我知道最简单的方法就是忙着等待文件出现。方便的是,当要求ls列出的文件不存在时,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"
如果这是您需要多次执行的操作,请将其包装到函数中,否则as is应该执行您需要的操作

编辑:

正如在评论中指出的,在测试中使用像这样的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"

继续之前,请测试文件是否存在:

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

继续之前,请测试文件是否存在:

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

如果将try umask设置为0,则可能根本不需要chmod。如果您仍然没有获得正确的权限,请检查节点是否有更改权限的选项。

如果您将try umask设置为0,则可能根本不需要chmod。如果您仍然没有获得正确的权限,请检查node是否有更改权限的选项。

只是一个想法,不知道它是否有效:当创建套接字时,您不能从main.js发出信号,另一方面,在脚本中等待,直到收到该信号吗?可能是这样,但我不确定在bash中是如何构造的。您是否尝试过使用基于inotify的标签来记录文件的创建时间?从未听说过inotify。我会查一下并报告。如果套接字需要chmod,为什么main.js不这样做?相反,在运行main.js'之前创建套接字会更好吗?假设main.js在你的控制之下。只是一个想法,不知道它是否有效:你不能在创建套接字时从main.js发出信号,另一方面,在脚本中等待直到你收到信号吗?可能是这样的,但我不确定在bash中是如何构造的。您是否尝试过使用基于inotify的标签来记录文件的创建时间?从未听说过inotify。我会查一下并报告。如果套接字需要chmod,为什么main.js不这样做?相反,在运行main.js'之前创建套接字会更好吗?假设main.js在您的控制下。否,在[[-e filename]]上循环。ls不是必需的,也不是用于此目的。您没有重定向它将输出的错误消息,而是将所有潜在错误丢弃在一个无用的子shell中,如果必须的话,可以使用花括号。没有必要使用方括号和命令替换,因为if可以测试返回值,如果它使用的是命令[这是一个命令,包括用!求反。尤其是当你说你要测试返回值时,你真正要做的是使用方括号和命令替换来测试ls的文本输出。@DennisWilliamson你是对的,我很粗心。我已经编辑了,包括了你建议的改进。谢谢。不,在[[-e filename]]上循环.ls不是必需的,也不是用于此目的。您没有重定向它将输出的错误消息-而是将所有潜在错误丢弃在无用的子shell中。如果必须,请使用大括号。不必使用方括号和命令替换,因为如果这就是它的作用[这是一个命令,包括用!对其求反。特别是当你说你要测试返回值时,你真正要做的是使用方括号和命令替换来测试ls的文本输出。@DennisWilliamson你是对的,我很粗心。我已经编辑了,以包括你建议的I
改进。谢谢。如果我想检查与模式匹配的特定数量的文件,该怎么办?e、 g.仅当有5个文件与mysock[0-9]匹配时才继续。sock@TrevNorris:使用带有glob的数组并检查数组元素的计数:shopt-s nullglob;而a=mysock{0..9}.sock${a[@]}<5;做睡眠1;他工作得很辛苦。不得不将mysock{0..9}.sock更改为/tmp/myproc/mysock*.sock。但是,显示数组元素的计数是一个非常糟糕的技巧。如果我想检查与某个模式匹配的特定数量的文件,该怎么办?e、 g.仅当有5个文件与mysock[0-9]匹配时才继续。sock@TrevNorris:使用带有glob的数组并检查数组元素的计数:shopt-s nullglob;而a=mysock{0..9}.sock${a[@]}<5;做睡眠1;他工作得很辛苦。不得不将mysock{0..9}.sock更改为/tmp/myproc/mysock*.sock。但是显示数组元素的计数是一个非常糟糕的技巧。