2015-06-29 106 views
1

我有一個運行簡單NodeJS應用程序的無頭Raspberry Pi。如何從Raspberry Pi上的Node.js應用程序執行關機命令

我附加到Pi的唯一接口是一個單一的按鈕,它啓動和停止一個timelapse視頻錄製。

我知道在沒有正確關閉的情況下切斷Pi電源並不是一個好習慣,所以我想向Node添加一個關閉命令。

使用ShellJS,我可以做到這一點很簡單 - 如果用戶五秒鐘按住按鈕,我可以叫

shell.exec('sudo shutdown -h now'); 

這將關閉皮。當我通過ssh連接到Pi並且我自己調用了節點命令('node app.js')時,它的工作方式和預期一樣。但我的目標是讓我的Node應用程序在啓動時自動運行。我這樣做,通過使用「/etc/rc.local中」調用腳本的啓動:

su pi -c 'node /path/to/app.js' 

在這種情況下,關機命令不工作,我甚至不知道如何訪問節點控制檯查看它正在拋出什麼樣的錯誤。有人可以在這裏指出我正確的方向嗎?

+0

請問'pi'用戶有須藤PRIVS?另外,它可能是'$ PATH'問題​​,嘗試使用'sudo'和'shutdown'的完整路徑。 – robertklep

+0

這效果好多了,謝謝。但你能解釋爲什麼嗎?由於我在學習Linux,我很想了解何時以及爲什麼需要爲命令提供完整路徑。 –

回答

4

當您從/etc/rc.local啓動進程,這些進程將在有限的$PATH變量開始(的$PATH變量包含一個目錄列表在哪裏可以找到可執行程序,所以你不必使用完整的路徑啓動這些程序;相反,只是他們的名字就足夠了)。

這通常不包含系統二進制文件的路徑,如shutdown,它可以在/sbin中找到。

您的登錄shell最有可能會將這些系統路徑添加到$PATH,這就是爲什麼當從命令行啓動Node應用程序時,關閉可執行文件工作得很好。

但是,當從/etc/rc.local啓動相同的Node應用程序時,無法在$PATH中的任何目錄中找到關閉可執行文件,並試圖執行它將導致錯誤。

您可以通過使用到關機可執行文件的完整路徑解決這個問題,或者在/etc/rc.local增強的$PATH變量:

# /etc/rc.local 
export PATH=/sbin:/usr/sbin:$PATH 
su pi -c 'node /path/to/app.js' 
+0

謝謝羅伯特老師 –

相關問題