2013-11-25 81 views
4

我有一個在Vagrant虛擬環境中運行的Ubuntu Linux服務器。我使用服務器開發Web服務。當服務器啓動時,我有一個需要運行一次的shell腳本,以在/tmp/文件系統上設置緩存目錄結構。在安裝/寫入/ tmp之後需要運行Upstart腳本

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

回答

4

由於你的工作需要啓動時的本地文件系統安裝很可能需要以下定義: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 

最後,你可以考慮使用流浪shell provisioner創建所需的緩存目錄。

+0

很好的答案,謝謝。我確實考慮過shell提供程序,但默認情況下(儘管可能每次都會強制運行),provisioning只運行一次,這就是爲什麼我正在尋找一種將功能置入無用客戶端的方法。 – SunSparc

+1

我不知道需求,但通常的[位置](http://www.linfo.org/var.html)應用程序緩存應該是/ var/cache/app-name。然而,在這種情況下,它將在應用程序上,例如,你清理緩存。 :) –

+0

這是很好的知道(雖然也許脫離主題)。在這個特定的實例中,應用程序是一個Web應用程序,並且正如Web用戶一樣運行。網絡用戶默認情況下似乎沒有對'/ var/cache'的寫入權限。 – SunSparc

0

在通讀「​​」時,我發現了一個關於「正常開始」的部分,它使用runlevels來觸發一個暴發戶腳本。調整我的腳本如下允許/tmp/在安裝後要運行的腳本:

start on runlevel [2345] 

有可能是其他的解決方案,同樣可行。

3

儘管@schkovich接受的答案當然足夠,但我想補充一點,流浪者會發出一個vagrant-mounted事件。即使在local-filesystems之後也會發出此事件。我只是有一種情況,就是在這個問題,這隻能要解決說明我得到了同樣的錯誤:

start on vagrant-mounted 

來源:this博客文章。

相關問題