2012-03-31 236 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