Linux 运行服务启动脚本时未加载环境变量

Linux 运行服务启动脚本时未加载环境变量,linux,bash,shell,Linux,Bash,Shell,当我使用启动服务脚本时。/script start能够通过找到的代理环境变量获取凭据,如果我启动服务脚本(如service script start)无法通过找不到的代理环境变量获取凭据,则找不到代理。如何通过服务脚本启动使用此脚本 脚本: #!/bin/bash -l # chkconfig: 2345 20 80 if [ "$system" = "redhat" ]; then ## source platform specific external scripts .

当我使用启动服务脚本时。/script start能够通过找到的代理环境变量获取凭据,如果我启动服务脚本(如service script start)无法通过找不到的代理环境变量获取凭据,则找不到代理。如何通过服务脚本启动使用此脚本

脚本:

#!/bin/bash -l
# chkconfig: 2345 20 80

if [ "$system" = "redhat" ]; then
    ## source platform specific external scripts
    . /etc/init.d/functions
  ## set or override platform specific variables
    lockfile=${LOCKFILE-/var/lock/subsys/$SERVICE_NAME}

    ## set or override platform specific functions
    start_daemon() {
        daemon --user $1 --pidfile $2 "$3 $4"
    }
    log_daemon_msg() {
        echo -n $"$1"
    }
    echo_ok() {
        echo_success; echo
    }
    echo_fail() {
        echo_failure; echo
    }
    log_success_msg() {
        success $"$@"
    }
    log_failure_msg() {
        failure $"$@"
        echo $"$@"
    }
    log_action_msg() {
        echo $@
    }
fi

if [ -n "$http_proxy" ] ; then
   echo "proxy found"
    echo $http_proxy | grep "@"
    if [ $? -eq 0 ]; then
        PROXY_HOST=$(echo $http_proxy | sed 's/http:\/\/.*@\(.*\):.*/\1/')
        PROXY_PORT=$(echo $http_proxy | sed 's/http:\/\/.*@.*:\(.*\)/\1/' | tr -d "/")
        USERNAME=$(echo $http_proxy | sed 's/http:\/\/\(.*\)@.*/\1/'|awk -F: '{print $1}')
        PASSWORD=$(echo $http_proxy | sed 's/http:\/\/\(.*\)@.*/\1/'|awk -F: '{print $2}')
    else
        PROXY_HOST=$(echo $http_proxy | sed 's/http:\/\/\(.*\):.*/\1/')
        PROXY_PORT=$(echo $http_proxy | sed 's/http:\/\/.*:\(.*\)/\1/' | tr -d "/")
    fi
fi

start() {

        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
            CMD="java "
            if [ -n "$PROXY_HOST"   -a  -n "$PROXY_PORT" ] ; then
                CMD="java -Dhttps.proxyHost=$PROXY_HOST -Dhttps.proxyPort=$PROXY_PORT"
                if [ -n "$USERNAME" -a -n "$PASSWORD" ]; then
                CMD="$CMD -Dhttps.proxyUser=$USERNAME -Dhttps.proxyPassword=$PASSWORD"
                fi
            fi
            #nohup $CMD -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
            #echo "$PATH_TO_JAR"
            echo "$CMD"
            nohup $CMD -jar $PATH_TO_JAR 2>> /tmp/glog >> /tmp/glog &
            echo $! > $PID_PATH_NAME

            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is already running ..."
        fi
     }
 case "$1" in
    start)
       start
       ;;
*)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0
当我运行像./script start这样的脚本时,脚本能够找到代理设置并传递代理设置。但在使用服务脚本启动运行时,无法找到代理设置。在使用服务运行脚本时,我是否遗漏了加载环境变量的任何内容?

来自man服务:

服务在尽可能可预测的环境中运行System V init脚本,删除大多数环境变量,并将当前工作目录设置为/

因此,当您尝试运行服务脚本时,只有几个env变量,如TERM、LANG,您的http\u代理和https\u代理被丢弃。要使用所需的环境变量,可以在文件/etc/default/yourservice中使用以下内容定义它们:

并在脚本的开头找到它的来源:

[ -f /etc/default/yourservice ] && . /etc/default/yourservice
[ -f /etc/default/yourservice ] && . /etc/default/yourservice