【问题标题】:Running shell script on instance startup在实例启动时运行 shell 脚本
【发布时间】:2012-03-31 04:01:15
【问题描述】:

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

sudo /glassfish3/bin/asadmin start-domain

当我手动输入时有效。

我尝试在几个地方添加此命令,但没有成功:

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

我已经给每个脚本 777 权限了。

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

【问题讨论】:

  • 你检查你的日志了吗?没什么兴趣?
  • (如果运行 Debian 或 Ubuntu,顺带一提,最好使用 update-rc.d 命令在 /etc/init.d, 中安装脚本,而不是这样做手动。)
  • @jcomeau_ictx 信息会记录在哪里?
  • 如果@jcomeau_ictx 不在他的键盘上,我会回答。日志在 /var/log/。 在我的系统上,具体的日志是 /var/log/daemon.log。
  • 谢谢!我正忙于其他事情。

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


【解决方案1】:

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

假设脚本 /glassfish3/bin/asadminroot 拥有, 您可以将其文件权限设置为 6755。这就是您可能的意思sudo去做。当然,它也可能很危险,并且可能存在安全风险。

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

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

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

采取额外护理的几种方法是可能的。一种如下。

  1. 保留文件权限为 755 的可执行文件。
  2. 编写并编译一个小型包装器,该程序使用 unistd.hexecv() 来启动可执行文件。
  3. 如果可行,不要让包装器接受任何参数;否则,让它的论点尽可能地受到限制和僵化。让包装器严格控制传递给可执行文件的参数。
  4. 让包装器由 root 拥有, 但使用chown 为其分配一个合适的组,其成员资格不包括任何用户。您可能更愿意为此目的创建一个新组,但如果您扫描系统上的/etc/group 文件,您不太可能找到适合的现有组。作为参考,您可以通过ls -l /bin /usr/bin | grep -vE '^([^[:space:]]+[[:space:]]+){2}(root[[:space:]]+){2}' 或类似的方式列出系统上已经属于特殊用途组的命令。
  5. 授予包装文件权限 6754,从而使其无法执行,除非对相关组。
  6. 允许调用脚本加入组,并赋予调用脚本文件权限2755。

如果调用脚本已经属于一个组,您可能只使用同一个组。

该技术可能有多种变体,您不太可能完全使用上面列出的一种,但是如果您阅读chown 命令上的联机帮助页和/或信息条目并了解文件权限的详细信息,如果您进行一些试验,您应该能够制定一个适合您的解决方案,而不会带来安全风险。

【讨论】:

  • 将权限更改为 6755 并删除 sudo 有效。谢谢!
【解决方案2】:

很可能是 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

JAVA_HOME 和 PATH 应该在用户的.bashrc.bash_profile 中设置

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2016-12-03
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多