0

有两个目录,其中包含一些文件。我正在使用 Hadoop,这两个目录都是 Hadoop 文件系统。

目录的第一个位置-

/sys/edw/

目录的第二个位置-

/apps/only/

我想看看these two directories有没有files or not。如果它们包含一些文件,则continue and execute my other shell scripts,但如果它们不包含任何文件,wait for half an hour则再次检查文件是否已到达这两个目录。

如果它已经到达,则执行其他 shell 脚本,但如果它没有到达,则再次等待半小时,并继续每半小时检查一次。

算法-

If [ hadoop fs -ls /sys/edw/   AND hadoop fs -ls /apps/only/ ]
then
continue executing my other shell scripts
but if condition is not true
wait for half an hour and then check again with the if loop and keep on looking every half an hour until the if condition is not true

我只想在上面的 if 条件为真时执行下面的脚本。

query.sh

基本上我有几个我只想运行的脚本, if condition is true否则继续检查every half an hour并查看if condition is true or not.

我在奔跑SunOS 5.1

更新代码:-

我正在尝试类似下面的内容,并且此目录中不存在文件(/apps/hdmi/20120916),因此它应该休眠半小时,但不是休眠,而是执行它应该执行的其他 shell 脚本不是在做——

while [ ! hadoop fs -ls /apps/hdmi/20120916 ]; do
    sleep 1800
done

echo "Hello new11"
pwd

我做错了什么吗?

再次更新:-

while ! hadoop fs -ls /apps/hdmi/20120916 ; do
    sleep 1800
done

echo "Hello new11"
pwd

我也试过上面的那个,但是这个目录不存在(/apps/hdmi/20120916),而不是睡半个小时,它会打印Hello new11不应该发生的。它应该等待半个小时。我还缺少什么吗?我在跑步SunOS 5.1

4

3 回答 3

2

如果您不想使用cron,则可以使用无限循环:

while true; do
  if hadoop fs -ls /apps/hdmi/20120916; then
    query.sh # call other script
    break # exit loop
  else
    sleep 1800
  fi
done

我希望我正确理解了您的要求。

于 2012-09-16T18:20:52.357 回答
1

你不能使用while ! COMMAND; do. !在这种情况下不是否定运算符。您要做的是执行命令hadoop fs -ls /DIR并在命令未列出任何文件时休眠。

要执行命令,请将其放在反引号之间``

`hadoop fs -ls /apps/hdmi`

使用test或方括号[ ]来评估命令的输出。

[ `hadoop fs -ls /apps/hdmi` ]

true如果命令产生一个非零字符串(即当目录中有文件时),表达式将评估。由于这与您想要的相反(在没有文件时继续),您需要否定表达式。

[ ! `hadoop fs -ls /apps/hdmi` ]

因此,您的脚本应该看起来像这样:

while [ ! `hadoop fs -ls /apps/hdmi` ]; do
  sleep 1800
done

echo "Hello new11"

pwd

这是假设hadoop fs -ls当目录中没有文件时不会产生任何输出。

于 2012-09-16T18:53:13.937 回答
0

如果您希望脚本在条件变为真后退出,只需sleep 1800将脚本休眠 1800 秒(半小时),然后while循环:

while [ ! condition ]; do
    sleep 1800
done

# execute other scripts since condition is now true
于 2012-09-16T01:34:46.493 回答