2011-10-16 126 views
31

我有需要在引導的www數據用戶下運行來啓動一個Node.js的腳本。在開發過程中,我總是開始使用腳本:運行腳本rc.local中:腳本工作,但不會在引導

su www-data -c 'node /var/www/php-jobs/manager.js 

我看到了到底發生了什麼,manager.js現在工作的很好。搜索所以我發現我必須把它放在我的/etc/rc.local。另外,我學會了將輸出指向一個日誌文件並附加2>&1以「將stderr重定向到標準輸出」,它應該是一個守護進程,因此最後一個字符是&

最後,我/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. 

su www-data -c 'node /var/www/php-jobs/manager.js >> /var/log/php-jobs.log 2>&1 &' 

exit 0 

如果我運行這個自己(sudo /etc/rc.local):是的,它的作品!但是,如果我執行重新啓動沒有node進程正在運行,/var/log/php-jobs.log不存在,因此,manager.js不起作用。發生什麼事?

+1

如果添加'nohup(1)',它會起作用嗎? 'su www-data -c'nohup node /var/www/php-jobs/manager.js >> /var/log/php-jobs.log 2>&1&''或者你需要給絕對路徑'節點'因爲它不在'早期啓動時使用的'PATH'中? 'su www-data -c'/ path/to/node /var/www/php-jobs/manager.js >> /var/log/php-jobs.log 2>&1&'' – sarnold

+1

不幸的是,不管工作。我試過a)添加nohup b)添加絕對路徑/ usr/bin /節點和c)檢查/var/log/php-jobs.log的權限,將它們設置爲www-data:www-data。重啓後,沒有'node'進程(如果我自己啓動它,則是這種情況),並且/var/log/php-jobs.log爲空。感謝您的快速回復,其他建議? –

+2

也許增加'upstart'配置文件; [顯然它需要'HOME'配置](http://kevin.vanzonneveld.net/techblog/article/run_nodejs_as_a_service_on_ubuntu_karmic/)? – sarnold

回答

5

我結束了upstart,工作正常。

3

您也可以使人們通過指定的完整路徑節點工作。此外,當您想要將shell命令作爲守護程序運行時,您應該在&之前添加1 < &以關閉stdin。

4

在Ubuntu中我注意到有2個文件。真正的是/etc/init.d/rc.local;看來其他/etc/rc.local是假的?

一旦我修改它確實正如預期執行正確的(/etc/init.d/rc.local)。

+12

瀏覽'/ etc/init.d/rc.local',看起來'/etc/rc.local'是由前者執行的。 –

61

在我使用的IO重定向在執行的第一行,以我自己的日誌文件中的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. 

exec 2> /tmp/rc.local.log # send stderr from rc.local to a log file 
exec 1>&2      # send stdout to the same log file 
set -x       # tell sh to display commands before execution 

/opt/stuff/somefancy.error.script.sh 

exit 0 
+3

這是爲什麼被拒絕?它正確地指定了完整的路徑,但也使得人們可以輕鬆排除其他腳本的故障。 – Lucas

+3

非常棒的幫助!謝謝John Doe –

+2

非常有用!幫助我調試我的rc.local腳本。 – dopplesoldner

1

我得到了我的腳本編輯/etc/rc.local然後發放工作如下3個命令。

sudo mv /filename /etc/init.d/ 
sudo chmod +x /etc/init.d/filename 
sudo update-rc.d filename defaults 

現在該腳本在啓動時起作用。

+0

我把我的script.sh放在/etc/init.d中,但是它並沒有在啓動時執行。你能告訴我該怎麼做編輯在/etc/rc.local工作我的scirpt.sh – Mohini

0

這很可能是由缺少或不完整的PATH環境變量引起的。

如果提供給您的可執行文件(蘇和節點),它會工作完整的絕對路徑。

-3

rc.local只在啓動時運行。如果重新啓動並希望腳本執行,則需要進入以K99前綴開頭的rc.0文件。

10

在某些linux上(例如RH的Centos &),/etc/rc.local最初只是到/etc/rc.d/rc.local的符號鏈接。在這些系統上,如果符號鏈接中斷,並且/etc/rc.local是單獨的文件,則在啓動時不會看到對/etc/rc.local的更改 - 引導過程將運行/etc/rc.d中的版本。 (如果手動運行/etc/rc.local,它們將工作,但不會在啓動時運行。)

聽起來像dimadima的系統上,它們是獨立的文件,但/etc/rc.d/rc.local調用/etc/rc.local

/etc/rc.local到「真正的」,如果一個移動rc.local到備份目錄和副本之一/etc/rc.d可能會丟失的符號鏈接它從頭開始創建它,但沒有意識到/etc中的原始符號只是一個符號鏈接。

+0

這解決了我的問題。我使用符號鏈接將'/ etc/rc.local'重定向到了我自己的配置文件。當我運行它時它運行良好,但是'/ etc/rc.local'在啓動時沒有被訪問。我用符號鏈接替換了'/ etc/rc.d/rc.local'到我的配置文件,然後重新創建了默認的CentOS'/ etc/rc.local'符號鏈接到'/etc/rc.d/rc.local'。 –

2

如果您在雲上使用Linux,那麼通常您沒有機會用手觸摸真正的硬件。所以你在第一次啓動時看不到配置界面,當然也不能配置它。因此,firstboot服務將永遠在rc.local的方式。解決的辦法是通過做禁用firstboot

sudo chkconfig firstboot off 

,如果你不知道爲什麼你的rc.local不跑,你總是可以從/etc/rc.d/rc文件檢查,因爲這個文件將始終運行並調用其他子系統(如在rc.local )。

0

1不要推薦使用root來運行應用程序,如節點應用程序。

那麼你可以做到這一點,但可能會捕獲更多的例外。

2 rc.local通常以root用戶身份運行。

因此,如果你的腳本應該像其他用戶一樣運行,比如www U,那麼應該確保PATH和其他環境正常。

3我發現一個簡單的方法來運行服務作爲用戶:

須藤-u WWW -i /的/路徑/的/你/腳本

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

1

我有同樣的問題(在CentOS 7)和I固定它通過給/ etc/local執行權限:

chmod +x /etc/rc.local 
1

我使用CentOS的7

$ cd /etc/profile.d 

$ vim yourstuffs.sh 

鍵入以下到yourstuffs.sh腳本。無論你想在這裏執行

export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:$LD_LIBRARY_PATH 

保存並重啓OS

類型。

+0

這種方法的問題是這些腳本是在登錄時執行的,而不是在啓動時執行。他們會在每次有人登錄時執行,並且作爲該用戶,因此例如任何需要'root'的東西都不起作用。 – robert

0

這是我的理解是,如果你把你的腳本在一定的運行級別,你應該使用ln -s腳本鏈接到你希望它在工作的水平。

0

我使用的rc.local以往。但我從我的經驗中得知,在系統啓動時運行腳本的最可靠的方法是在crontab中使用@reboot命令。例如:

@reboot path_to_the_start_up_script.sh 
相關問題