有两个目录,其中包含一些文件。我正在使用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
答案 0 :(得分: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
我希望我能正确理解你的要求。
答案 1 :(得分: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
不会产生任何输出。
答案 2 :(得分:0)
如果您希望脚本在条件成立后退出,只需使用sleep 1800
将脚本休眠1800秒(半小时),并围绕该脚本while
循环:
while [ ! condition ]; do
sleep 1800
done
# execute other scripts since condition is now true