如果文件存在,如何在脚本中进行?
#!/bin/bash
echo "Start"
# waiting to be exist file
echo "file already exists, continuing"
如果文件存在,如何在脚本中进行?
#!/bin/bash
echo "Start"
# waiting to be exist file
echo "file already exists, continuing"
执行 a while
if 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"
有一些特定于操作系统的方法可以在文件系统上执行阻塞等待。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
在这个过程中完成。
对 fedorqui:有这么好吗?这儿存在一个问题?
#!/bin/bash
(
..
my code
..
) &
PID=$BASHPID or PID=$$
while [ ! ps -ef | grep $PID ]
do
sleep 0
done
谢谢