2012-08-03 39 views
2

什麼會導致.sh腳本通過SSH shell正常工作,但不是在通過PHP或crontab執行時會發生什麼?Shell腳本僅在通過ssh使用時啓動應用程序

我有一個用於運行遊戲服務器的VPS,但爲了使其可維護,我正在計劃自動執行許多繁瑣的過程(如設置或刪除服務器)以及製作重要功能(如啓動和停止服務器)很容易爲那些真正需要它的人所接受。

現在,當我編寫shell腳本並測試它們時,它們工作得非常好。 startserver啓動了服務器,restartserver重啓了它等等。但是當從PHP運行時,或者 - 正如我後來想到的--crontab,啓動服務器神奇地不起作用。停止它們,檢查它們是否正在運行,更新以及所有其他功能如預期的那樣工作,但啓動服務器只是沒有做任何事情。它什麼都不打印時只返回0。

例如,下面是一個腳本,在任何情況下工作的一個例子:(statusserver.sh)

/sbin/start-stop-daemon -v -t --start --exec ~mta/servers/$1/files/mta-server -- -d 

這裏是一個不以任何情況下工作:(startserver.sh)

/sbin/start-stop-daemon -v --start --exec ~mta/servers/$1/files/mta-server -- -d 

唯一的區別是,statusserver.sh有「-t」,它只會告訴你,如果沒有-t做同樣的命令實際上是成功的。和執行statusserver.sh像這樣:

sudo -u mta ~mta/sh/statusserver.sh test 

確實沒有工作,打印的東西沿着「將開始〜MTA /服務器/測試/文件/ MTA服務器-d」行。但是這樣做:

sudo -u mta ~mta/sh/startserver.sh $2 

絕對沒有。它不打印任何東西,它實際上返回0.(這應該表示操作成功)

現在有趣的部分:當服務器已經運行時,startserver.sh將執行它應該做的事情做:說服務器已經運行,並返回一個錯誤代碼。 (因爲start-stop-daemon對我來說足夠了)但它拒絕啓動任何東西。

更換啓動 - 停止守護的東西,如:

sudo -u mta ~mta/servers/test/files/mta-server -d 

是否完全一樣的東西:它只是將拒絕運行,而仍然被方式返回0。

哦,這不是一個sudo問題。那我敢肯定,因爲下面的工作也沒關係

sudo -u web1 sudo -u mta ~mta/scripts/startserver.sh test 

所以,回到我的問題:什麼會導致Linux上,殼牌,猛砸或者通過運行一切以平掉拒絕啓動應用程序無論是PHP還是crontab,而通過SSH啓動時高興地接受它?有什麼設置需要切換嗎?任何可以阻止我想要做的包?任何其他的事情,我只是想念?

+0

你指定的腳本或二進制可執行文件? – 2012-08-03 23:54:45

+0

是的。我正在觸發其他用戶的個人文件夾中的shell腳本,以便完成各種操作,並且在使用SSH觸發它們時,它們都可以運行。但是,使用PHP時,啓動命令將不會觸發。 – Gamesnert 2012-08-04 12:09:54

回答

0

看看使用sudo。

爲Apache運行的用戶(通常用於'nobody'用戶或'apache'用戶)設置/ etc/sudoer(使用visudo),因爲這是Apache通常運行的用戶。使用NOPASSWD選項授予您要運行的命令的sudo訪問權限。

在你的PHP腳本,使用EXEC()來執行命令來啓動/停止守護進程和前綴sudo命令的命令。

這裏是關於sudo的文章:

http://www.cyberciti.biz/tips/allow-a-normal-user-to-run-commands-as-root.html

+0

我想我應該早點清理這件事,所以我道歉:PHP文件(WEB1)的用戶已經以供其他用戶(MTA)執行命令sudo的使用。 (即 「命令-u MTA SH /home/mta/sh/startserver.sh $ 1」)這工作得很好,因爲所有命令的工作。除了startserver.sh,它似乎是Web服務器或其他我無法想象的東西的限制。我會編輯我的問題,以便更清楚地瞭解這一點。 – Gamesnert 2012-08-04 12:08:23

0

因爲我覺得賈斯汀觸及,但沒有具體說,它似乎不能夠運行的腳本是問題apache用戶帳戶(通常用途非常有限)由於權限而無法看到用戶的主目錄。通常只有用戶和root可以看到他們自己的主目錄。你可以做一些事情,sudo來運行在主目錄中的腳本,將它移出用戶的主目錄的或可能改變腳本/家庭的權限,使他們能夠在用戶的主目錄被Apache運行。

+0

這可能不是這樣的,因爲我現在已經嘗試在這兩個問題本身更詳細一點,並響應Justin的答案解釋。如果是這種情況,我想知道,不會停止服務器等也給出問題?因爲目前情況並非如此; 「start-stop-daemon -v -start」只是拒絕完全啓動可執行文件,而沒有任何關於爲什麼的指示,而0作爲返回碼 - 通常表示成功。雖然我可能只是錯了。無論哪種方式,我對這種情況都有點不清楚,但是謝謝你試圖澄清這一點。 – Gamesnert 2012-08-04 12:23:12

相關問題