根本無法讓 rc.local 自動運行

根本無法讓 rc.local 自動運行

所以我一直在嘗試讓/etc/rc.local腳本運行,但在我的一生中,似乎沒有任何效果。我可以使用 手動運行它service rc.local start,它只是將“hi”回顯到我的主目錄中的文件,但在重新啟動時它不會運行。所有正確的權限似乎都已設置,並且連結存在於正確的 rc#.d 目錄中。作為參考,以下是相關資訊:

# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 45 Apr 12 21:10 /etc/rc.local


# ls -l /etc/init.d/rc.local                                  
-rwxr-xr-x 1 root root 812 Apr 12 21:00 /etc/init.d/rc.local


# for i in {0..6}; do cd rc$i.d ; pwd; ls -l |grep rc.local; cd ..; done
/etc/rc0.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
/etc/rc1.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
/etc/rc2.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc3.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc4.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc5.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc6.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local


# cat /etc/rc.local
#! /bin/bash

echo hi > ~user/test

exit 0

我嘗試刪除/etc/rc.local/etc/init.d/rc.local運行update-rc.d rc.local remove,然後恢復它們並update-rc.d rc.local defaults像這個問題一樣運行:rc.local不執行。那沒有用。

重新啟動或進入任何初始化等級後它也不起作用。當 shebang 行讀取#! /bin/sh -e或 時,它不起作用#! /bin/bash。不過,如果我手動運行它,我可以讓/etc/rc.local/etc/init.d/rc.local腳本回顯到不同的檔案。

所以我的問題是......我做錯了什麼以及如何讓 rc.local 運行?另外,雖然我不介意聽到替代方案(例如暴發戶),但我只會接受向我展示(或幫助我找到)如何讓rc.local 正常運行(並且最好告訴我出了什麼問題)的答案。

以下是一些有關其價值的附加資訊:

# dmesg | grep "Linux version"
[    0.000000] Linux version 3.5.0-17-generic (buildd@allspice) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 (Ubuntu 3.5.0-17.28-generic 3.5.5)


# cat /proc/version
Linux version 3.5.0-17-generic (buildd@allspice) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012

# lsb_release -a
No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 14 Nadia
Release:        14
Codename:       nadia

答案1

問題在於這一行:

echo hi > ~user/test

~user並沒有像你預期的那樣擴展。rc.local正在運行,但由於意外的擴展,它試圖寫入可能沒有權限的某個地方。

請嘗試以下方法:

echo ~user/test > /dev/shm/test

然後檢查 的內容/dev/shm/test。這將顯示它rc.local確實運行,以及它正在擴展~user到什麼。

儘管如此,我的建議是使用顯式路徑,而不是依賴外部環境。

答案2

「我不介意聽到替代品(例如暴發戶)」意味著你不明白一些事情。我不是薄荷用戶,但顯然它是一個基於新貴的系統。 Upstart 是一個 init 守護進程,您的系統只安裝了一個。所以暴發戶不是一個替代方案;別無選擇——你的系統使用了upstart。時期。它不使用任何其他東西。然而,upstart 包含與 sysvinit 腳本的向後相容性,這意味著您可以透過在 /etc/rc 目錄中放置連結來管理服務,並使用一些舊命令,例如serviceupdate-rc.d

由於您自己承認不太了解 sysvinit 系統的工作原理,因此我認為您學習它是浪費時間。您不妨了解一下真正的 init 守護程式是如何運作的。 Upstart 非常簡單;請記住,95% 對它的抱怨(以及對 Fedora 派生系統上的 systemd 的類似抱怨)只是那些對 sysvinit 有簡單掌握的人,並且因為他們可能需要花幾個小時學習一些東西而感到憤怒新的。

所以,我想說要檢查 rc 目錄等,以獲取 sysvinit 樣式鏈接,但是從您鏈接到您所說的解決方案失敗的“Rc.local 不執行”問題的外觀來看,我認為您在浪費時間此時。忘記 sysvinit 相容性以及 /etc/rc 和 init.d 目錄。

Upstart 處理.conf文件/etc/init(注意:不是 init.d)。因此,如果您想在啟動時執行某些腳本,只需將 .conf 檔案新增至 /etc/init 即可。它不必是可執行的,但應該由 root 擁有。

author "You"

start on started local-filesystems

script
    /etc/rc.local # but don't really be this lazy, see below
end script

為了防止將來的混淆和進一步的 sysvinit 惡作劇,我建議您將 /etc/rc.local 腳本的名稱更改為其他名稱,或者更好的是,只需將其中的所有內容移動到 .conf 文件中(scriptend script標籤之間的所有內容都會被處理由外殼)。

新貴的權威參考可能是新貴食譜。就像我說的,這是 sysvinit 在用戶友好性方面的一項改進,但不幸的是,網路上仍然缺乏關於它的像樣材料,並且有很多混亂和不完整的東西。但在啟動時運行腳本就像剛才描述的那樣簡單。

如果 .conf 檔案名稱為“my-localboot.conf”,您可以使用下列命令測試您的服務

initctl start my-localboot

相關內容