作者 主題: 開機和重新啟動 apache 的 exec() 路徑不同  (閱讀 8294 次)

0 會員 與 1 訪客 正在閱讀本文。

hoyo

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 4049
  • 性別: 男
  • 有需要的時候,學習就不會分階段。
    • 檢視個人資料
    • 樂咖黑電腦學習網
OS: FreeBSD 7.0
WEB: Apache 2.2
PHP:  5.2.5

今天發現有一隻程式重新開機後失效,
原因是直接開機 xxx 的 set path 沒有 /usr/local/php  ( 會說 xxx 是因為我不知道 path 應該是 apache 還是 php 負責設定的 )

搞半天都沒有辦法讓 exec() 可以加入這個路徑 ( exec( 'set path=/bin:/usr/bin:/usr/loca/bin:; 要執行的指令' ) )
最後我下了 /usr/local/etc/rc.d/apache22 restart 結果就好了.... = ="

1. 有人知道為什麼嗎?
2. 有人知道設定開機 php exec() 預設路徑嗎?
受人與魚,不如授人與漁
上海自來水來自海上;倫敦好奇人奇好敦倫

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5394
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
寫在 script 裡頭去設定如何? 只要知道那個 script 在那兒就可以執行, 剩下的就是那個 script 的事了.

hoyo

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 4049
  • 性別: 男
  • 有需要的時候,學習就不會分階段。
    • 檢視個人資料
    • 樂咖黑電腦學習網
有試過將指令加上絕對路徑執行,
本來是應該要解決問題的,
沒想到其中有一個指令偷偷呼叫「另外的指令」
後來也有「勤勞」的將 /usr/local/bin 的指令 ln -s 到 /usr/bin 內
結果有指令給我跑去讀「另外的檔案」
..... 然後我就沒轍了

寫在 script .... 我會再來試試看
因為我覺得這個問題很詭異,
萬一無法解決那我「征服世界」的計畫就泡湯了
受人與魚,不如授人與漁
上海自來水來自海上;倫敦好奇人奇好敦倫

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5394
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
我的意思是在那個 script 一開頭就 export PATH 來用, 並不是全部都用絕對路徑.
這樣應該可以解決吧.

hoyo

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 4049
  • 性別: 男
  • 有需要的時候,學習就不會分階段。
    • 檢視個人資料
    • 樂咖黑電腦學習網
果然使用 script 就將問題解決了,感謝指教。

==========

還是有問題,再研究看看
« 上次編輯: 2009-02-24 09:20 由 hoyo »
受人與魚,不如授人與漁
上海自來水來自海上;倫敦好奇人奇好敦倫

hoyo

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 4049
  • 性別: 男
  • 有需要的時候,學習就不會分階段。
    • 檢視個人資料
    • 樂咖黑電腦學習網
看起來目前依照我的智慧是沒有辦法解決了
主機開機

使用 PHP system( 'set' ); 得到

代碼: [選擇]
HOME=/
IFS='
'
LD_LIBRARY_PATH=/usr/local/lib:
OPTIND=1
PATH=/sbin:/bin:/usr/sbin:/usr/bin
PPID=802
PS1='$ '
PS2='> '
PS4='+ '
PWD=/usr/local/www/apache22/data/test
RC_PID=45

使用 script 內的 set 指令回傳

代碼: [選擇]
addsuffix
argv 1
csubstnonl
cwd /usr/local/www/apache22/data/test
dirstack /usr/local/www/apache22/data/test
echo_style bsd
gid 80
group www
history 100
home /
killring 30
owd
path (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /root/bin /usr/local/bin)
shell /bin/csh
shlvl 1
status 0
tcsh 6.15.00
tty
uid 80
user www
version tcsh 6.15.00 (Astron) 2007-03-03 (i386-intel-FreeBSD) options wide,nls,dl,al,kan,sm,rh,color,filec

以上兩個環境都是無法執行指令,
原因是執行的指令他會呼叫其他的指令,
而且被呼叫的指令會根據使用者的環境讀取對照的檔案,

root 身份重新啟動 apache 之後
以下為可以執行環境的回傳,使用指令為 PHP system( 'set' );

代碼: [選擇]
BLOCKSIZE=K
EDITOR=vi
FTP_PASSIVE_MODE=YES
GROUP=wheel
HOME=/root
HOST=team.hoyo.idv.tw
HOSTTYPE=FreeBSD
IFS='
'
LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib:
LOGNAME=root
MACHTYPE=i386
MAIL=/var/mail/root
OPTIND=1
OSTYPE=FreeBSD
PAGER=more
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/root/bin
PPID=13685
PS1='$ '
PS2='> '
PS4='+ '
PWD=/usr/local/www/apache22/data/test/a
RC_PID=13661
REMOTEHOST=192.168.1.70
SHELL=/bin/csh
SHLVL=1
TERM=xterm
USER=root
VENDOR=intel

裡面可以看到 USER=root ,
因為我是使用 root 權限重新啟動 apache22
但是從 php 呼叫執行的程式卻不需要 root 權限。
我搞不太懂...  有空再來研究
« 上次編輯: 2009-02-24 11:19 由 hoyo »
受人與魚,不如授人與漁
上海自來水來自海上;倫敦好奇人奇好敦倫

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5394
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
所以是權限的問題? 不是路徑的問題?
php 在 apache 裡頭用 module 執行就是用 apache 的執行身份跑, 你可以自己 su - www 再去跑那個 script 看看有什麼差別吧.

如果一定要用 root 跑, 可能要用 CGI 的方式去跑某個有 suid/sgid 的程式吧. 不過這樣可能有安全上頭的問題.
弄個 daemon 在後端跑, 前端 php 只做負責通知的動作可能會比較好一些.

hoyo

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 4049
  • 性別: 男
  • 有需要的時候,學習就不會分階段。
    • 檢視個人資料
    • 樂咖黑電腦學習網
所以是權限的問題? 不是路徑的問題?
php 在 apache 裡頭用 module 執行就是用 apache 的執行身份跑, 你可以自己 su - www 再去跑那個 script 看看有什麼差別吧.

如果一定要用 root 跑, 可能要用 CGI 的方式去跑某個有 suid/sgid 的程式吧. 不過這樣可能有安全上頭的問題.
弄個 daemon 在後端跑, 前端 php 只做負責通知的動作可能會比較好一些.

果然造成誤會了,
我的意思是用 root 登入後,將 apache22 重新啟動,
apache 的權限還是 www

也就是說開機啟動的 apache 無法執行
我必須用 root 登入將 apache22 重新啟動才可以
問題是,兩者回傳的 system( 'set' ) 是不一樣的,
我不知道是不是這個不一樣造成的,
只是我覺得很奇怪,
Linux 難道沒有這樣子的差異嗎?
受人與魚,不如授人與漁
上海自來水來自海上;倫敦好奇人奇好敦倫

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5394
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
因為開機時跑的 root 環境變數與你後來登入的 root 環境變數不同. (比較常見的是 locale 不同, linux 上頭也有相同的問題)
在 apache 的啟動 script 前面加上 . /root/.bashrc 如何 (如果是 bash 的話) ? 如果你知道差那些變數, 也可以直接寫到 apache 的 script 上頭.

hoyo

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 4049
  • 性別: 男
  • 有需要的時候,學習就不會分階段。
    • 檢視個人資料
    • 樂咖黑電腦學習網
因為開機時跑的 root 環境變數與你後來登入的 root 環境變數不同. (比較常見的是 locale 不同)
在 apache 的啟動 script 前面加上 . /root/.bashrc 如何 (如果是 bash 的話) ?

啊... 我回家來試試看 (這種要重新開機的測驗還是回家測驗)

感謝提供解決方案 (這個解法很合邏輯,看起來成功的機率很大)
受人與魚,不如授人與漁
上海自來水來自海上;倫敦好奇人奇好敦倫

hoyo

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 4049
  • 性別: 男
  • 有需要的時候,學習就不會分階段。
    • 檢視個人資料
    • 樂咖黑電腦學習網
失敗了... 沒想到 FreeBSD 在開機階段使用的 shell 是 sh

就算在啟動的 script 或是 apache 的 script 加入 .cshrc

排除了權限 (cp /root/.cshrc; chmod +x .cshrc),以及執行路徑 (/bin/csh /usr/local/etc/rc.d/.cshrc)

使用 system('set') 得到的結果和沒執行是一樣的...

我還是等「靈光」好了 (靈光乍現)
受人與魚,不如授人與漁
上海自來水來自海上;倫敦好奇人奇好敦倫