【问题标题】:Upstart script needs to run after /tmp is mounted and writableUpstart 脚本需要在 /tmp 挂载且可写后运行
【发布时间】:2013-11-25 20:11:12
【问题描述】:

我有一个在 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

显然startupstart on 来说太早了。问题是,/tmp 什么时候可以写,我应该将什么传递给start on

【问题讨论】:

    标签: linux upstart


    【解决方案1】:

    由于您的工作需要在安装本地文件系统时开始,您很可能需要以下定义:start on local-filesystems

    查看本地文件系统事件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 来创建所需的缓存目录。

    【讨论】:

    • 很好的答案,谢谢。我确实考虑过 shell 配置器,但配置只运行一次,默认情况下(尽管每次都可以强制运行),这就是为什么我正在寻找一种方法将功能放入 vagrant guest 中。
    • 我不知道要求,但通常用于应用程序缓存的 location 是 /var/cache/app-name。但是,在这种情况下,它将在应用程序上,例如你清理缓存。 :)
    • 很高兴知道(尽管可能离题了)。在此特定实例中,应用程序是一个 Web 应用程序,因此以 Web 用户身份运行。默认情况下,Web 用户似乎没有对 /var/cache 的写入权限。
    • 确实如此。但是,用户 www-data 不需要对 /var/cache 的写访问权,而是对 /var/cache/app-name 的写访问权,这可以在设置期间授予:chown -R www-data:www-data /var/cache/app-name && chmod -R u+w /var/cache/app-name。说到稍微偏离主题:每当我发现自己处于类似情况时,我会退后一步,问自己我正在尝试解决哪个问题并寻找替代方案,结果证明这是一个不错的决定。在这种情况下,创建的目录结构将不会保留,因为 /tmp 将在重新启动时被清除。与其寻找解决方法,不如重新定义问题。 :)
    • 我同意。尽管在这种情况下,我不介意在重新启动时清除数据,因为它仅用于开发。虽然使用/var/cache/app 我可以更改脚本为我清除它而不是重新创建它。对于我目前的情况,两者都是可行的解决方案。感谢所有反馈。
    【解决方案2】:

    虽然@schkovich 接受的答案肯定足够了,但我想补充一点,Vagrant 会发出一个vagrant-mounted 事件。即使在local-filesystems 之后也会发出此事件。我刚刚遇到了与问题中描述的相同错误的情况,只能通过以下方式解决:

    start on vagrant-mounted
    

    来源:this 博文。

    【讨论】:

      【解决方案3】:

      在阅读“Upstart Intro, Cookbook and Best Practises”时,我发现了一个关于“正常启动”的部分,它使用runlevels 来触发暴发户脚本。如下调整我的脚本允许脚本在安装/tmp/ 后运行:

      start on runlevel [2345]
      

      很可能还有其他同样可行的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-28
        • 1970-01-01
        • 2019-11-26
        • 1970-01-01
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多