在实例启动时运行shell脚本

时间:2012-03-31 04:01:15

标签: linux amazon-ec2 amazon-web-services glassfish-3

我正在尝试在我的EC2实例启动时运行bash脚本。我想要做的就是在服务器启动时启动GlassFish。我正在尝试运行的命令是:

sudo /glassfish3/bin/asadmin start-domain

当我手动输入时,它会起作用。

我尝试在几个地方添加此命令但没有运气:

  • 在/etc/rc.local
  • 的末尾
  • 在/etc/rc.d/rc.local
  • 的末尾
  • 在/etc/init.d /
  • 中创建了我自己的脚本

我已经为每个脚本提供了777个权限。

任何人对我做错了什么有任何想法?

2 个答案:

答案 0 :(得分:4)

除非奇怪配置,否则sudo在运行时需要身份验证。它通常意味着以交互方式运行。

假设脚本 / glassfish3 / bin / asadmin root所有,您可以将其文件权限设置为6755.这样做可能意味着{{1 }} 去做。当然,它也可能是危险的,可能存在安全风险。

(@ jcomeau_ictx是对的,顺便说一句。你应该按照他的建议检查日志。)

为了档案的利益而更新:幸运的是,上述答案似乎已经解决了OP的直接问题,所以我们将其留在那里。但是,由于此答案将保留存档,而其他人可能会在以后查找,我应该添加更多答案。

一个可以将任何可执行文件的文件权限更改为6755,但这并不总是一个好习惯。这种权限的影响是(a)让任何人以(b)可执行文件所有者的完全权限运行可执行文件。有时,这正是您想要的,但请注意:在OP的情况下,具有此类权限的sudo现在可以由具有完全root权限的任何参数调用。如果这不是你想要的,那么你必须额外注意。

可以采取多种方式进行额外护理。一个如下。

  1. 保留具有文件权限的可执行文件755。
  2. 编写并编译一个小包装程序,该程序使用 unistd.h /glassfish3/bin/asadmin来启动可执行文件。
  3. 如果切实可行,不要让包装者接受任何争论;否则,让它的论点尽可能地受到限制和不灵活。让包装器严格控制传递给可执行文件的参数。
  4. 让包装器归 root所有,但使用execv()为其分配一个合适的组,其成员资格不包含任何用户。您可能更愿意为此目的启动一个新组,但是,如果您扫描系统上的chown文件,则不太可能找到适合的现有组。作为参考,您可以通过/etc/group等列出系统中已属于特殊用途组的命令。
  5. 给予包装器文件权限6754,从而使其不可执行,除了相关组。
  6. 允许调用脚本加入组,并为调用脚本文件授予权限2755。
  7. 如果调用脚本已经属于某个组,那么您可以在整个过程中使用相同的组。

    该技术的几种变体是可能的,并且您不太可能使用上面列出的那种,但是如果您阅读ls -l /bin /usr/bin | grep -vE '^([^[:space:]]+[[:space:]]+){2}(root[[:space:]]+){2}'命令上的联机帮助页和/或信息条目并了解文件的详细信息权限,如果你进行一些实验,你应该能够制定一个适合你的解决方案而不会带来安全风险。

答案 1 :(得分:1)

最有可能是JAVA_HOME问题,请尝试使用sudo -i,这是我的工作初始化脚本:

#!/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

应在用户的.bashrc.bash_profile

中设置JAVA_HOME和PATH