非root用户执行开机启动服务脚 本

一、需求

centos6下面添加开机服务,例如开机启动supervisor服务,然后supervisor会负责拉起配置的进程,从而实现各种服务的开机重启。

二、原理需求

在centos6下面主要通过在/etc/init.d/下面添加服务脚本和chkconfig命令来完成添加启动服务

  • 添加服务的启停脚本
    如果需要开机启动服务,或者通过service命令控制服务,必须在/etc/init.d/下面有对应服务的启停脚本,如果我们的服务为supervisor,那么在/etc/init.d/下面对应的启停脚本就是supervisor,且具有执行权限。启停脚本个格式一般都是固定的,比如包括start、stop等函数,来用来对服务进行启动/关闭

#!/bin/bash
#
# supervisord   This scripts turns supervisord on
#
# Author:       Mike McGrath <[email protected]> (based off yumupdatesd)
#               Jason Koppe <[email protected]> adjusted to read sysconfig,
#                   use supervisord tools to start/stop, conditionally wait
#                   for child processes to shutdown, and startup later
#               Mikhail Mingalev <[email protected]> Merged
#                   redhat-init-jkoppe and redhat-sysconfig-jkoppe, and
#                   made the script "simple customizable".
#               Brendan Maguire <[email protected]> Added OPTIONS to
#                   SUPERVISORCTL status call
#
# chkconfig:    345 83 04
#
# description:  supervisor is a process control utility.  It has a web based
#               xmlrpc interface as well as a few other nifty features.
#               Script was originally written by Jason Koppe <[email protected]>.
#
# usage:rename this script to ‘supervisor‘ and put it to directory /etc/init.d/

# source function library
. /etc/rc.d/init.d/functions

# service strips all environment variables but TERM, PATH and LANG,
# so we need export those variables explicitly.
# see http://unix.stackexchange.com/questions/44370/how-to-make-unix-service-see-environment-variables
export HOSTNAME
export USER=hadoop2

# hadoop‘s environment variables
. /home/hadoop2/.bashrc

SUPERVISORD=/usr/bin/supervisord
SUPERVISORCTL=/usr/bin/supervisorctl

PIDFILE=/tmp/supervisord.pid
LOCKFILE=/tmp/supervisord

OPTIONS="-c /usr/local/supervisor/supervisord.conf"

# unset this variable if you don‘t care to wait for child processes to shutdown before removing the $LOCKFILE-lock
WAIT_FOR_SUBPROCESSES=yes

# remove this if you manage number of open files in some other fashion
ulimit -n 96000

RETVAL=0

running_pid()
{
    # Check if a given process pid‘s cmdline matches a given name
    pid=$1
    name=$2
    [ -z "$pid" ] && return 1
    [ ! -d /proc/$pid ] && return 1
    (cat /proc/$pid/cmdline | tr "\000" "\n"|grep -q $name) || return 1
    return 0
}

running()
{
    # Check if the process is running looking at /proc
    # (works for all users)

    # No pidfile, probably no daemon present
    [ ! -f "$PIDFILE" ] && return 1
    # Obtain the pid and check it against the binary name
    pid=`cat $PIDFILE`
    running_pid $pid $SUPERVISORD || return 1
    return 0
}

is_root()
{
    current_user=`whoami`
    if [ "x"$current_user == "xroot" ];then
       echo "current_user is:"$current_user
       return 0
    elif [ "x"$USER == "xroot" ];then
       echo "USER is:"$USER
       return 0
    else
       return 1
    fi
}

start() {
        echo "Starting supervisord: "
        if running ; then
            echo "ALREADY STARTED"
		    return 1
		fi

        if  is_root ;then
                # start supervisord with options from sysconfig (stuff like -c)
                su hadoop2 -c "$SUPERVISORD $OPTIONS"

                # show initial startup status
                su hadoop2 -c "$SUPERVISORCTL $OPTIONS status"

                # only create the subsyslock if we created the PIDFILE
                su hadoop2 -c "[ -e $PIDFILE ] && touch $LOCKFILE"
        else
                # start supervisord with options from sysconfig (stuff like -c)
                $SUPERVISORD $OPTIONS

                # show initial startup status
                $SUPERVISORCTL $OPTIONS status

                # only create the subsyslock if we created the PIDFILE
                [ -e $PIDFILE ] && touch $LOCKFILE
        fi

}

stop() {
        echo -n "Stopping supervisord: "
        if is_root ;then
           su hadoop2 -c "$SUPERVISORCTL $OPTIONS shutdown"
        else
           $SUPERVISORCTL $OPTIONS shutdown
        fi
	if [ -n "$WAIT_FOR_SUBPROCESSES" ]; then
            echo "Waiting roughly 60 seconds for $PIDFILE to be removed after child processes exit"
            for sleep in  2 2 2 2 4 4 4 4 8 8 8 8 last; do
                if [ ! -e $PIDFILE ] ; then
                    echo "Supervisord exited as expected in under $total_sleep seconds"
                    break
                else
                    if [[ $sleep -eq "last" ]] ; then
                        echo "Supervisord still working on shutting down. We‘ve waited roughly 60 seconds, we‘ll let it do its thing from here"
                        return 1
                    else
                        sleep $sleep
                        total_sleep=$(( $total_sleep + $sleep ))
                    fi

                fi
            done
        fi

        # always remove the subsys. We might have waited a while, but just remove it at this point.
        rm -f $LOCKFILE
}

restart() {
        stop
        start
}

case "$1" in
    start)
        start
        RETVAL=$?
        ;;
    stop)
        stop
        RETVAL=$?
        ;;
    restart|force-reload)
        restart
        RETVAL=$?
        ;;
    reload)
        $SUPERVISORCTL $OPTIONS reload
        RETVAL=$?
        ;;
    condrestart)
        [ -f $LOCKFILE ] && restart
        RETVAL=$?
        ;;
    status)
        $SUPERVISORCTL $OPTIONS status
        if running ; then
            RETVAL=0
        else
            RETVAL=1
        fi
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
        exit 1
esac

exit $RETVAL

一些坑

  • 开机启动的用户身份是root,可我们需要是其他用户身份,比如hadoop启动服务
    使用su user -c
    "cmd_here" 来执行服务启动,可以用你希望的用户身份启动服务
  • 环境变量读取不到,例如JAVA_HOME等,造成服务启动不成功
    这主要是service系统在执行时,会strip掉除TERM、PATH等以外所以环境变量。解决的办法是在启停服务脚本中export需要的环境变量
  • 添加或启动service时,提示No such file or
    directory

    可能是你在windows下面编辑文件,然后上传到linux,因为windows的许多编辑器会在末尾多加换行。详细解决方案,看这里

    1、运行检查

cat -v /etc/init.d/your_init_script

2.解决

sed -i -e ‘s/\r//g‘ /etc/init.d/your_init_script
时间: 2024-10-24 09:44:24

非root用户执行开机启动服务脚 本的相关文章

linux非root用户执行开机启动程序

问题 开机启动其他用户的程序或者说非root用户执行开机启动 编写开机启动脚本 编写开机启动脚本apple_tree,放到/etc/init.d,系统启动时会自动执行. 例如,/etc/init.d/apple_tree 启动脚本的内容格式,可参考linux service . 其中的start做如下定义: start(){ su - deploy -c ${APPLE_BIN} } 表示切换到deploy用户,并且环境变量也改变到deploy的环境,然后执行脚本. 如果是做成后台服务,需要修改

linux指定某非root用户执行开机启动项的方法(gogs git)

以linux指定git用户在linux开机时执行启动gogs git为例: 以root登录linux 执行vi /etc/rc.d/rc.local 在文档末尾添加一行语句:su git -c "/data/gogs/gogs  web > /data/gogs/log/gogs_web.log 2>&1 &" 保存rc.local即可.

设置开机启动时指定非ROOT用户执行相应的脚本

1 [[email protected] sm01]# vim /etc/rc.d/rc.local 2 3 #!/bin/sh 4 # 5 # This script will be executed *after* all the other init scripts. 6 # You can put your own initialization stuff in here if you don't 7 # want to do the full Sys V style init stuf

非root用户执行export报错

export: Command not found 是因为之前做centos镜像时切换到了admin用户(whoami还是显示的是root,很诡异啊) su切换到root用户就好了 这次写下来,下次再遇到这情况,就知道是怎么回事了 [[email protected] bin]# export histtimeformat="%f %t " export: Command not found. [[email protected] bin]# export export: Comman

非root用户启动nginx master process

nginx启动进程可以在conf里指定user(user  work;)但是这个只有在用root启动的情况有意义,如果要是用非root用户比如www-data启动nginx,则需要注释掉use work:这行 /usr/sbin/nginx  -c /etc/nginx/nginx.conf 这样 www-data  41121      1  0 19:40 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/ngin

Docker安全--关于Docker使用root与非root用户的场景中的容器与host中的执行用户的研究

/************************************************* * Author : Samson * Date : 08/15/2015 * Test platform: * gcc 4.8.2 * GNU bash, 4.3.11(1)-release (x86_64-pc-linux-gnu) * ***********************************************/ 结论 实际进行测试的Dockerfile是shadowso

linux系统非ROOT用户80端口不能启动tomcat问题的变通办法——通过Iptables端口转发

2010-07-17 13:21:42 org.apache.tomcat.util.digester.SetPropertiesRule begin 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'debug' to '0' did not find a matching property. 2010-07-17 13:21:42  org.apache.catalina.core.Ap

非root用户ssh 执行 sudo远程机器免密钥

非root用户ssh 执行 sudo远程机器免密钥 # 1.登陆192.168.1.10 ssh-keygen -t rsa # 一路回车 # 将公钥添加到认证文件中 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # 并设置authorized_keys的访问权限 chmod 600 ~/.ssh/authorized_keys [[email protected] ~]# cat /root/.ssh/id_rsa.pub          

tomcat非root用户启动443或80端口

非root用户没有权限使用1024以内的端口,tomcat默认是root启动,如果用普通用户启动,必须是1024以上的端口,不能使80或443 如果一定用到80或是443所以只能用iptables端口转发 iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443 原文地址:https://www.cnblogs.com/wangdidi/p/11510986.html