2012-03-31 234 views
1

我想在啓動EC2實例時運行bash腳本。我想要做的就是在服務器啓動時啓動GlassFish。我試圖運行的命令是:實例啓動時運行shell腳本

sudo /glassfish3/bin/asadmin start-domain 

當我手動輸入時,它會起作用。

我試圖在沒有運氣了幾個地方添加此命令:

  • 在/etc/rc.local中
  • 在/etc/rc.d/rc月底結束。當地
  • /etc/init.d/boot.d中

我給每個腳本777個權限創建我自己的腳本。

任何人有什麼想法我做錯了什麼?

+2

你檢查你的日誌?沒有什麼興趣? – 2012-03-31 04:10:10

+1

(如果運行Debian或Ubuntu,順便說一句,您使用'update-rc.d'命令在* /etc/init.d, *中安裝腳本,而不是手工完成是非常有序的。) – thb 2012-03-31 04:20:03

+0

@jcomeau_ictx信息會記錄在哪裏? – 2012-03-31 04:33:20

回答

4

除非奇怪地配置,否則sudo需要在運行時驗證。它通常意味着交互式運行。

假設腳本/glassfish3 /斌/ asadmin的根擁有,你可以設置它的文件權限設置爲6755.這做什麼你大概意思sudo做。當然,它也可能是危險的,可能是安全風險。

(@jcomeau_ictx是正確的,順便說一下,您應檢查日誌,他建議。)

更新檔案的好處:以上回答幸運似乎已經解決了OP的迫在眉睫的問題,所以我們我會把它留在那。但是,由於這個答案將會保留,而其他人可能會在稍後查看它,所以我應該補充一些。

一個可以將任何可執行文件的文件權限更改爲6755,但這並不總是一種好的做法。這些權限的效果是(a)讓任何人以(b)可執行文件所有者的全部特權運行可執行文件。有時候,這正是你想要的,但是請看:在OP的情況下,具有這種權限的/glassfish3/bin/asadmin現在可以被任何人用任何參數調用,並具有完全的root權限。如果這不是你想要的,那麼你必須採取一些額外的照顧。

可以採取幾種額外照顧的方式。一個如下。

  1. 離開可執行文件權限755
  2. 編寫和編譯一個小包裝,它採用的execv() unistd.h中啓動可執行的程序。
  3. 如果切實可行,請不要讓包裝帶有任何爭議;否則,讓它的論點儘可能地受到限制和僵化。讓包裝嚴格控制傳遞給可執行文件的參數。
  4. 讓包裝由根,擁有,但使用chown爲其分配一個合適的組,其成員不包括用戶。您可能更願意爲此目的創建一個新組,但如果您掃描系統上的/etc/group文件,則不太可能找到適合的現有組。作爲參考,您可以通過ls -l /bin /usr/bin | grep -vE '^([^[:space:]]+[[:space:]]+){2}(root[[:space:]]+){2}'等列出已屬於系統上特殊用途組的命令。
  5. 給包裝文件權限6754,從而使其不可執行,除了有問題的組。
  6. 承認調用腳本到組,並給調用腳本文件的權限2755

如果調用腳本已經屬於一個集團,你可能只需要使用相同的組貫穿始終。

該技術的幾種變體是可能的,並且您不太可能使用上面列出的一種,但是如果您閱讀chown命令的手冊頁和/或信息條目並瞭解文件權限的詳細信息,如果您嘗試了一點,您應該能夠制定出適合您的解決方案,而不會產生安全風險。

+0

將權限更改爲6755並刪除sudo。謝謝! – 2012-03-31 04:44:53

1

最有可能的是JAVA_HOME問題,請嘗試使用sudo -i,這是我工作的init腳本:

#!/bin/bash 
# description: Glassfish Start Stop Restart 
# processname: glassfish 
# chkconfig: - 95 80 

DOMAIN=domain555 

GF_HOME=/opt/glassfish3 
DOMAIN_DIR=/home/glassfish/domains 
RUN_AS=glassfish 

CMD_START="$GF_HOME/bin/asadmin start-domain --domaindir $DOMAIN_DIR" 
CMD_STOP="$GF_HOME/bin/asadmin stop-domain --domaindir $DOMAIN_DIR" 

function start() { 
    sudo -u $RUN_AS -i $CMD_START $DOMAIN 
} 

function stop() { 
    sudo -u $RUN_AS -i $CMD_STOP $DOMAIN 
} 

case $1 in 
start) 
    start; 
;; 
stop) 
    stop; 
;; 
restart) 
    stop; 
    start; 
;; 
esac 
exit 0 

JAVA_HOME和PATH應該設置,用戶.bashrc.bash_profile