2

如果文件存在,如何在脚本中进行?

#!/bin/bash
echo "Start"
# waiting to be exist file
echo "file already exists, continuing"
4

3 回答 3

4

执行 a whileif a sleep X,以便每隔 X 秒检查一次文件是否存在。

当文件存在时,while将完成,您将继续使用echo "file already exists, continuining".

#!/bin/bash
echo "Start"
### waiting to be exist file
while [ ! -f "/your/file" ]; # true if /your/file does not exist
do
  sleep 1
done
echo "file already exists, continuing"

而不是检查文件是否存在检查脚本是否已经完成了后台?

根据您发布的代码,我进行了一些更改以使其完全正常工作:

#!/bin/bash
(
sleep 5
) &

PID=$!
echo "the pid is $PID"

while [ ! -z "$(ps -ef | awk -v p=$PID '$2==p')" ]
do
  echo "still running"
  sleep 1
done

echo "done"
于 2013-09-19T11:24:37.233 回答
2

有一些特定于操作系统的方法可以在文件系统上执行阻塞等待。Linux 使用inotify(我忘记了 BSD 等价物)。安装inotify-tools后,可以编写类似于

#!/bin/bash
echo "Start"
inotifywait -e create $FILE & wait_pid=$!
if [[ -f $FILE ]]; then
    kill $wait_pid
else
    wait $wait_pid
fi
echo "file exists, continuing"

在收到来自已创建inotifywait操作系统的通知之前,调用不会退出。$FILE


不简单地调用inotifywait并让它阻塞的原因是有一个竞争条件:当你测试它时文件可能不存在,但它可以在你开始观察创建事件之前创建。为了解决这个问题,我们启动一个后台进程,等待文件被创建,然后检查它是否存在。如果是这样,我们可以杀死inotifywait并继续。如果它没有,inotifywait则已经在等待它,所以我们保证看到它被创建,所以我们简单地wait在这个过程中完成。

于 2013-09-19T13:26:30.663 回答
0

对 fedorqui:有这么好吗?这儿存在一个问题?

#!/bin/bash
(
..
my code
..
) &

PID=$BASHPID or PID=$$

while [ ! ps -ef | grep $PID ]
do
  sleep 0
done

谢谢

于 2013-09-19T11:41:27.650 回答