我有一个在Vagrant虚拟环境中运行的Ubuntu Linux服务器。我使用服务器开发Web服务。当服务器启动时,我有一个需要运行一次的shell脚本,以便在/tmp/
文件系统上设置缓存目录结构。
description "setup web cache"
start on startup
script
mkdir -p /tmp/cache/persistent
mkdir -p /tmp/cache/models
mkdir -p /tmp/cache/views
chmod -R 777 /tmp/cache/
end script
当我启动服务器时,我收到一条显示在/var/log/upstart/webcache.log
中的错误消息:
mkdir: cannot create directory `/tmp/cache': Read-only file system
显然startup
对start on
来说太早了。问题是,/tmp
何时可以写作以及我将哪些内容传递给start on
?
答案 0 :(得分:4)
由于您的作业需要在安装本地文件系统时启动,因此您很可能需要以下定义:start on local-filesystems
请参阅local-filesystem事件example。
您将找到众所周知的Upstart事件here的概述。
此外,您的工作是短暂的工作,而不是服务/守护程序。使用task节更合适。通过这种方式,您可以运行依赖于实际创建这些目录后创建的缓存目录的作业。否则,如果您定义所有从属作业以启动运行级别[2345]依赖作业可能在创建所需目录之前启动,例如依赖作业可能使用以下定义:start on started webcache
。
description "setup web cache"
start on local-filesystems
task
script
mkdir -p /tmp/cache/persistent
mkdir -p /tmp/cache/models
mkdir -p /tmp/cache/views
chmod -R 777 /tmp/cache/
end script
最后,您可以考虑使用Vagrant shell provisioner来创建所需的缓存目录。
答案 1 :(得分:3)
虽然@schkovich接受的答案肯定已经足够,但我想补充一点,Vagrant会发出vagrant-mounted
事件。即使在local-filesystems
之后也会发出此事件。我只是遇到了问题所描述的相同错误的情况,只能通过以下方式解决:
start on vagrant-mounted
来源:this博文。
答案 2 :(得分:0)
在阅读“Upstart Intro, Cookbook and Best Practises”时,我找到了一个关于“正常启动”的部分,该部分使用runlevels来触发新手脚本。如下调整我的脚本允许脚本在安装/tmp/
后运行:
start on runlevel [2345]
可能还有其他同样可行的解决方案。