LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 960|回复: 9

在 /tmp 目录下建立一个目录。 要求不能与已经存在的冲突。

[复制链接]
发表于 2009-9-27 16:04:59 | 显示全部楼层 |阅读模式
比如某个脚本需要用到临时文件, 为了防止同样的脚本同时运行的时候临时文件冲突。
所以决定把每次运行的临时文件放在 /tmp 目录下的一个子目录里。
不过又不知道如何去建立这个目录才不与已经存在的冲突。

用 if [-d ] 似乎不怎么可靠。多用户多任务。指不定谁就在俩语句之间干了点类似的事。一个语句建立一个唯一存在的目录,然后又把所建立的目录返回到一个特定的环境变量中方便使用呢。
发表于 2009-9-27 16:25:54 | 显示全部楼层
直接mkdir怎么样
  1. i=0
  2. while true
  3. do
  4. mkdir /tmp/tmpname-$i && { export TMPNAME=/tmp/tmpname-$i ; break; }
  5. ((i++))
  6. done
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-9-27 16:27:59 | 显示全部楼层
直接mkdir怎么样
  1. i=0
  2. while ! mkdir /tmp/tmpname-$i
  3. do
  4. ((i++))
  5. done
  6. export TMPNAME=/tmp/tmpname-$i
复制代码
不好意思,网络抽风。
回复 支持 反对

使用道具 举报

发表于 2009-9-27 17:56:13 | 显示全部楼层
使用 mktemp 命令,可创建一个唯一的文件名。
回复 支持 反对

使用道具 举报

发表于 2009-9-27 19:32:55 | 显示全部楼层
也可以用mcookie生成一个唯一的字符


  1. TMPDIR=/tmp/tmp-$(mcookie)
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-28 18:15:47 | 显示全部楼层
觉得 lastart 的方法不错。尝试建立,成功返回被创建的路径,失败就继续尝试创建。
直到创建目录成功。 好主意。

mktemp 没用过。不知道怎么用。
还有,线生成唯一字符串,然后创建目录的办法似乎不可靠。 还是觉得先创建成功然后在利用的安全。
回复 支持 反对

使用道具 举报

发表于 2009-9-28 18:53:14 | 显示全部楼层
mktemp 不过这个会建立一个文件
name=$(mktemp tmpXXXXXXX.tmp)
rm -f $name
mkdir $name
就行了XXX是随机的,唯一的。

或者用mcookie产生的数值作名字,基本上不会有重的
回复 支持 反对

使用道具 举报

发表于 2009-9-29 02:47:46 | 显示全部楼层
也可以直接用当前时间(ns):
dirname=`date +%s%N`
mkdir $dirname
回复 支持 反对

使用道具 举报

发表于 2009-9-29 09:06:31 | 显示全部楼层
Post by 木人;2031280
觉得 lastart 的方法不错。尝试建立,成功返回被创建的路径,失败就继续尝试创建。
直到创建目录成功。 好主意。
mktemp 没用过。不知道怎么用。
还有,线生成唯一字符串,然后创建目录的办法似乎不可靠。 还是觉得先创建成功然后在利用的安全。

mktemp就是直接在 /tmp 下创建了一个文件,并且把文件名告诉你。(至于成功/失败/重试的那些事情,mktemp都帮你做完了,完全不需要你操心,这难道不是最好的方案?)

你的脚本可以直接用这个文件了,也不用再考虑分目录的事情。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-30 15:32:26 | 显示全部楼层
还有个问题。
环境变量

比如,脚本1,设置环境变量 tmpdir ,然后运行脚本2,
脚本2 里面也有个 tmpdir 并且 这个变量跟脚本1的内容不同。
脚本2运行完成, 脚本1继续运行。 这个时候 tmpdir 里的数值有没有变化呢。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表