在服务脚本中使用环境变量

时间:2017-04-19 09:35:47

标签: bash shell unix sh init

我在服务脚本中使用环境变量时遇到问题。

在我的服务脚本中,我使用的是环境变量,即INSTALL_DIR,其值可能因系统而异。我必须从$ INSTALL_DIR获取安装目录,然后我必须启动该服务。当我运行服务脚本时,根本不会获取环境变量。

是否可以从INSTALL_DIR环境变量中获取安装目录。我能想到的另一个选择是使用INSTALL_DIR环境变量动态创建服务脚本。

echo "INSTALL DIR: ${INSTALL_DIR}"
name=`basename $0`
pid_file="/var/run/$name.pid"
get_pid() {
    cat "$pid_file"
}

is_running() {
    [ -f "$pid_file" ] && ps `get_pid` > /dev/null 2>&1
}

Start()
{
    echo "Starting Application"

    if is_running; then
        echo "[`get_pid`] Already Started"
    else
        if [ -z "$user" ]; then
            nohup $INSTALL_DIR/bin/application 2>&1 &
        else
            nohup sudo -u "$user" $cmd 1> $INSTALL_DIR/bin/application 2>&1 &
        fi
        echo $! > "$pid_file"
        if ! is_running; then
            echo "Unable to start, see logs"
            exit 1
        fi
        echo "[`get_pid`] Started"
    fi
}

我正在尝试使用以下命令运行应用程序

service application start

2 个答案:

答案 0 :(得分:1)

  

在我的服务脚本中...我必须从$ INSTALL_DIR获取安装目录,然后我必须启动该服务。

您的问题不是关于shell脚本,而是关于系统的启动问题。不幸的是,这个过程因Linux发行版而异,并且往往记录不佳。

例如, man service 表示, service在尽可能可预测的环境中运行System V init脚本或upstart作业,删除大多数环境变量并将当前工作目录设置为/.,但男子暴发户说:

$ man -k upstart
upstart: nothing appropriate.

不仅如此,服务联机帮助页专门列出了脚本将以其开头的环境变量。毋庸置疑,你的不在其中。

参数化启动脚本的传统方法是将信息放在已知文件中,通常在/etc中,并在脚本中引用该文件。在您的情况下,您可以执行以下操作:

INSTALL_DIR=$(cat /etc/my-install-dir.cfg)

然后继续进行。

可能有办法强制您的启动以支持其他环境变量。但是,迟早,您需要的信息必须存储在文件系统的某个地方。在我看来,最简单的方法是保留一个文件名来保存该信息,并直接读取该文件。

答案 1 :(得分:0)

在脚本中使用以下代码。

if [[ -z "${INSTALL_DIR}" ]]; then
  echo "INSTALL_DIR is undefined"
else
  INSTALL_DIR=<<your installation directory>>
fi