我的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当查询正在填充和创建文件时,如何更改权限?
发布于 2015-03-04 12:35:26
两个问题:
文件/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.Ds23dmktemp保证可以创建有效且唯一的临时文件名。
发布于 2015-03-04 08:44:21
chmod/chown是您的朋友,但是您需要确保运行shell脚本的用户/组具有写入/tmp目录的权限。
以下命令的输出是什么:
ls -ld /tmp
whoami
groupshttps://stackoverflow.com/questions/28844483
复制相似问题