我的shell脚本中有一个命令(increment.sh):
TMP_FILE=/tmp/sbg_clickstream.tmp
hive -e "select * from $HIVE_TMP_TABLE;" > $TMP_FILE
我在第二行收到错误:
/tmp/sbg_clickstream.tmp: Permission denied
Error: Error occured while opening data file
Error: Load Failed, records not inserted.
Load failed (exit code 1)
我尝试chmod 750 /tmp/sbg_clickstream.tmp
并再次运行脚本,但我仍然遇到同样的错误。
我是shell脚本的新手,我认为在dir/file
时创建了TMP_FILE=/tmp/sbg_clickstream.tmp
。但是经过上面的测试,结论却没有。
我认为dir/file
是在这一行中创建的:
hive -e "select * from $HIVE_TMP_TABLE;" > $TMP_FILE
如何在填充查询和创建文件时更改权限?
答案 0 :(得分:1)
两个问题:
/tmp/sbg_clickstream.tmp
?如果运行脚本的用户拥有该文件,则问题可能出在shell设置本身。
从命令行键入set -o
,然后检查clobber
或noclobber
的值。如果noclobber
设置为on
或clobber
设置为off
,则无法通过重定向覆盖文件。您需要设置或取消设置clobber
/ noclobber
。
如果你的shell有clobber
的值(比如Kornshell),你需要这样做:
$ set -o clobber # Turns clobber on
如果你的shell有noclobber
的值(比如BASH),你需要这样做:
$ set +o noclobber # Turns noclobber off
是的,-o/+o
参数似乎向后。
不要反复使用相同的文件名,请尝试以下操作:
TMP_FILE=/tmp/sbg_clickstream.$$.tmp
hive -e "select * from $HIVE_TMP_TABLE;" > $TMP_FILE
$$
代表pid,因此一直在变化。系统重新启动时,应该清除/tmp
目录。否则PID会攀升,不应该重复。这样,每次运行都会生成一个新的临时文件,您不必担心是否有辱骂。
查看您的系统是否有mktemp
命令。这将生成一个唯一的临时文件名:
TMP_FILE=$(mktemp -t sbg_clickstream.XXXXX)
echo "The tempfile is '$TMP_FILE'
hive -e "select * from $HIVE_TMP_TABLE;" > $TMP_FILE
这可能会回应这样的事情:
The tempfile is /tmp/sbg_clickstream.Ds23d
mktemp
保证创建有效且唯一的临时文件名。
答案 1 :(得分:0)
chmod / chown是你的朋友,但你需要确保运行shell脚本的用户/组有权写入/ tmp目录。
以下内容的输出是什么:
ls -ld /tmp
whoami
groups