2012-06-04 32 views
4

我有一個通過rc.local啓動的python守護進程。這個具有相同權限的腳本安裝在我有的其他幾個Ubuntu盒子上。它在這些安裝上運行沒有問題。也就是說,重新啓動該框後,守護進程正在運行。我的rc.local文件(Ubuntu)有什麼問題?

雖然這個特殊的安裝,守護進程沒有運行到登錄時,並檢查進程的存在。系統之間的的rc.local文件是相同的(或至少足夠接近):

[email protected]:~$ cat /etc/rc.local 
#!/bin/sh -e 
# 
# rc.local 
# 
# This script is executed at the end of each multiuser runlevel. 
# Make sure that the script will "exit 0" on success or any other 
# value on error. 
# 
# In order to enable or disable this script just change the execution 
# bits. 
# 
# By default this script does nothing. 

python /var/www/myDaemon/Main.py > /var/log/somelog.txt 

exit 0 

的權限包括:

[email protected]:~$ ls -la /etc/rc.local 
-rwxr-xr-x 1 localaccount localaccount 370 Jun 3 11:04 rc.local 

我測試如果rc.local中處理得到通過使用該測試執行rc.local:

[email protected]:/var/log/sosmsd$ cat /etc/rc.local 
#!/bin/sh -e 
# 
# rc.local 
# 
# This script is executed at the end of each multiuser runlevel. 
# Make sure that the script will "exit 0" on success or any other 
# value on error. 
# 
# In order to enable or disable this script just change the execution 
# bits. 
# 
# By default this script does nothing. 

echo "test" > /home/localaccount/test1 
/usr/bin/python /var/www/sosms/sosmsd/Main.py > /var/log/sosmsd/log/log 
echo "test" > /home/localaccount/test2 

exit 0 
[email protected]:/var/log/sosmsd$ 

並且只有第一個測試文件(test1)在重新啓動盒子後創建。我猜這意味着蟒蛇線造成某種問題的,但我得到在/ var沒有輸出/日誌/ sosmsd /日誌/日誌:

[email protected]:~$ ls 
test1 

更新:

我再其次larsks的意見和決定,我是從啓動python腳本收到此錯誤:

mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)") 

這是否意味着MySQL已經不得不被初始化的機會之前,正在執行的rc.local中?我從哪裏出發?

回答

3

您應該從可用的骨架爲您的守護進程創建一個初始化腳本/etc/init.d/mydaemon

然後您將能夠設置其啓動順序,以便MySQL已經可用。

這是good starting point

3

Python異常 - 和大多數其他錯誤消息 - 轉到stderr,但您只是重定向stdout。你應該運行你的服務是這樣的:

python /var/www/myDaemon/Main.py > /var/log/somelog.txt 2>&1 

2>&1告訴shell來stderr輸出發送到同一個地方stdout。做到這一點,併發布你看到的任何錯誤消息,如果問題不是最終顯而易見的。

+0

您的建議幫助了我。 –

0

從MySQL文檔: C.5.2.2. Can't connect to [local] MySQL server

錯誤(2002)無法連接到...通常意味着沒有MySQL服務器運行在系統上,或者你正在使用不正確的Unix套接字文件名稱或TCP/IP端口號嘗試連接到服務器時。您還應該檢查您使用的TCP/IP端口是否未被防火牆或端口阻止服務阻止。

「/var/run/mysqld/mysqld.sock」文件是否存在?

mysql服務器是否與python守護進程運行在同一臺服務器上?

你看過mysql日誌嗎?

應位於/var/log/

名字類似:
mysql.log
mysql.err
mysqld.log
mysqld.err

$ sudo ls -l /var/log/ 
// when you have the name try 
$ sudo tail -n 50 /var/log/LogName 

一種可能性是,你的磁盤空間不足,請嘗試:

$ sudo df -h 

看看第四列 「庫存狀況」

另一種可能性是該文件夾的權限,請嘗試:

$ sudo ls -l /var/lib/ 

您應該看到這樣的事情:

drwxr-xr-x 33 mysql  mysql 4096 May 22 10:02 mysql 

你最有可能想要所有者和組爲「mysql」,如果他們不是,您可以嘗試:

$ sudo chown -R mysql:mysql /var/lib/mysql 

首先記錄原始設置,以便在沒有幫助時將其更改回來。 「-R」表示遞歸地爲子文件夾和文件更改所有權。

的權限應爲rwxr-XR-X(755),如果不是你可以試試:

$sudo chmod 755 /var/lib/mysql 

我不會做遞歸,大部分的文件和文件夾的只應是可訪問mysql用戶,可能是mysql組,只能讀/寫不可執行。

+0

雖然這在技術上是可以修復MySQL服務器的問題,但在問題的上下文中,rc.local在init.d之前執行。這裏的問題是MySQL在啓動過程中沒有啓動。 – hsanders

+0

你是對的,這就是爲什麼我在你發佈它時投票給你的答案。但是我留下了這個答案,因爲這些信息可能對未來某個人有用。 – codewaggle

7

其他人回答錯過的一件事是在啓動時運行的rc,init等腳本中,PATH變量可能會或可能不會被初始化(這從來沒有保證),這意味着簡化「python somescript」。 py「而不是/ usr/bin/python可能無法正常工作。總是在init腳本和rc腳本中使用絕對路徑。

是的,很可能在啓動mysqld之前運行rc.local。您需要將其設置爲init.d腳本,並在標題中使用insserv樣式的註釋來告訴它需要哪些依賴關係。 http://manpages.ubuntu.com/manpages/lucid/man8/insserv.8.html

+0

是的,rc.local不會像人們希望的那樣運行。在我的CentOS 7.2系統上,我有一個MariaDB數據庫操作在啓動時運行,並且有類似的問題。我通過在數據庫操作之前將「systemctl start mariadb.service」添加到rc.local來修復它。儘管接受的答案在技術上是正確的,但它並沒有解決rc.local和/或如何使rc.local按需工作的問題。 – Andrew

1

我的朋友。我花了幾天的時間來處理這個錯誤。幸運的是我有一個解決方案。

sudo -u www -i /the/path/of/your/script 

請喜歡須藤手冊〜 -i [命令] 的-i(模擬初始登錄)選項運行由目標用戶的密碼數據庫條目作爲登陸shell指定的殼...

U可以更喜歡我在這裏發佈的內容:Run script with rc.local: script works, but not at boot

祝你好運!