2009-06-12 31 views
4

我需要一個應用程序在我的Web服務器的後臺運行,但我需要能夠以root權限啓動/停止應用程序。如何使通過Web服務器接受命令的Linux服務?

爲了做到這一點,我想讓一個具有root權限的服務運行,以便它可以終止應用程序,並在需要時再次啓動它。

最後,我需要能夠通過Apache/PHP將啓動和終止命令發送到服務,以便通過網絡間接控制它。

如何創建Linux服務?
如何以這種方式與Linux服務進行通信?

在此先感謝!

回答

6

在您的PHP腳本中使用exec命令來調用shell文件。 shell文件可以使用「setuser」位進行設置,因此它將作爲其所有者運行(而不是使用Web服務器的權限運行)。

當然,你需要非常小心 - 大量的測試,監控等

最後,想想服務運行作爲專用的用戶,而不是root。例如像Apache和大多數其他做得好的服務。

補充:Re:在Linux中運行一個服務。取決於你的Linux風格。如果你想確保你的應用程序服務將自動重新啓動,如果失敗的話,再加上記錄,結賬Runit:

https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/opensource/?p=202

http://smarden.org/runit

補充:不是setuid位的,我認爲弗蘭克的使用sudo系統的建議(評論中)更好。

+4

而不是SETUSER位,你可以添加一個規則,允許腳本執行到/ etc/sudoers文件,如:阿帕奇ALL =(root)NOPASSWD:/bin/my.restart.script.sh - 然後你只是exec('sudo /bin/my.restart.script.sh'); – 2009-06-12 02:42:49

+0

+1我同意弗蘭克。我認爲爲你的特定cmds設置sudoers要比設置setuser位更好。另外,sudo可以記錄普通用戶(php服務器)調用sudo命令作爲root用戶的時間。 – 2009-06-12 02:45:26

+0

感謝您的回覆!你知道我將如何與服務溝通? – 2009-06-12 02:48:20

0

這樣做時要非常小心。切勿在exec命令中使用任何用戶提交的網絡數據。這可以讓別人在你的機器上任意執行命令。

此外,我第二次弗蘭克使用sudo規則,以便您可以運行具體的命令與您需要的權限,但沒有別的。這樣做會更安全。

1

您可以創建接受下列命令的守護程序:

  • daemon_name start
  • daemon_name stop
  • daemon_name restart
  • deamon_name reload

啓動守護程序應該不難。從PHP腳本執行daemon_name start應該運行它。啓動後,可以將進程的PID寫入鎖定文件(稍後停止,重新啓動或重新加載)。守護進程應該處理信號。

在PHP腳本中,您可以調用daemon_name stop。這應該啓動一個新的守護進程,它將檢查鎖定文件並獲取正在運行的守護進程的PID併發送將由正在運行的守護進程處理的信號。鎖定文件應該被刪除/清除,然後stop啓動守護進程/進程可以退出。

1

我想你應該看看inetd,它可以配置爲運行各種服務,並且它以root身份運行。然後,您可以編寫一個相對簡單的程序,該程序本身不具有root特權,但是當它由root運行時,可以完成您需要完成的任務。

1

就與服務進行通信而言,您沒有說出它是什麼類型的服務,但假設您自己編寫它,最常用的方法是通過UNIX套接字或MMAP進行通信。取決於你的需求。

哦,是的,應該指出已經有應用程序的Linux系統的網絡管理。 Webmin是一個非常好的配置,可以根據需要進行儘可能多的控制或儘可能少的控制。

3

所以,你這裏有三個部分:

  • 你無需root權限
  • 申請
  • 正在監視應用

你的問題不是推出一個守護進程的Web服務器守護進程,它正在寫它,並從Web服務器與它進行通信,而不需要root權限。

後臺程序可以在後臺啓動了非交互式應用程序一樣簡單:

# my_dameon & 

我不是一個PHP developper,而是尋找消息隊列和PHP,我發現beanstalkd
綜觀例如在第一頁上,似乎你可以用它來執行以下操作:

  • 的阿帕奇/ PHP發送一些消息beanstalkd
  • 你的守護進程從beanstalkd中讀取消息。根據該命令啓動或終止或重新加載後臺應用程序。

您可以用PHP編寫你的守護,因爲有client in many languages
您還可以檢查this question

1

由於@shodanex表明,使用Beanstalkd將是一個很好的方式斷開與網絡的前端一個以root身份運行的命令行工作者。它可以被簡單地設置爲只運行所需的。

要運行worker,Pear's System_Daemon可以通過start/stop/restart生成並運行守護進程運行腳本。

0

當然與

sudo apt-get install openbsd-inetd 

您可以創建一個服務,你想