自动生成一个systemd服务

发布时间 2023-06-26 22:47:40作者: ho966

systemd兼容/etc/init.d/目录下的启动脚本,可以自动生成systemd服务,如下举例:

main.cpp

#include <iostream>
#include <unistd.h>

int main()
{
    while(1)
    {
        std::cout<<"hello world"<<std::endl;
        sleep(10);
    }
    return 0;
}

g++ main.cpp -o main

service.sh ,一个通用脚本,提供安装、卸载、启动、停止服务

#!/bin/bash
#chkconfig: 2345 80 40
#description: DESCRIPTION
#pidfile:/var/run/DEFAULT_SEVICE_NAME.pid

SYS_PATH=/etc/init.d
SEVICE_NAME=DEFAULT_SEVICE_NAME
EXE_PATH=DEFAULT_EXE_PATH
EXE_NAME=DEFAULT_EXE_NAME
PID_FILE=/var/run/DEFAULT_SEVICE_NAME.pid
CORE_LIMIT_NUM=3

#$1 service name , $2 exe name
Install()
{
    if [ -z "$1" ];then
        echo "please input parame1:service name."
        return 1
    fi
    if [ -z "$2" ];then
        echo "please input parame1:exe name."
        return 1
    fi
    if [ ! -d $SYS_PATH ];then
        mkdir -p $SYS_PATH
        chmod 777 $SYS_PATH
    fi

    SEVICE_NAME=$1
    EXE_NAME=$2
    EXE_PATH=`pwd`
    if [ ! -f $EXE_PATH/$EXE_NAME ]; then
        echo "$EXE_PATH/$EXE_NAME not exist"
        return 1
    fi    
#set suid_dumpable
    if [ -e /proc/sys/kernel/suid_dumpable ]; then
        echo 1 > /proc/sys/kernel/suid_dumpable
    else
        echo 1 > /proc/sys/fs/suid_dumpable
    fi
#set core dump dir
    echo 'core-%e-%p-%t'  > /proc/sys/kernel/core_pattern
    ulimit -c unlimited
#copy self to /etc/init.d
    sed  -e "s%DEFAULT_SEVICE_NAME%$SEVICE_NAME%g"  \
        -e "s%DEFAULT_EXE_PATH%$EXE_PATH%g"\
        -e "s%DEFAULT_EXE_NAME%$EXE_NAME%g" $0 > $SYS_PATH/$SEVICE_NAME
    
    chmod 755 $SYS_PATH/$SEVICE_NAME
    chmod 755 $EXE_PATH/$EXE_NAME
    if [ -f /etc/init.d/functions ]; then
        chkconfig --add $SEVICE_NAME
    elif [ -f /lib/lsb/init-functions ];then
        update-rc.d $SEVICE_NAME defaults
    else
        echo "unrecognized sysv command"
        return 1
    fi    
    systemctl daemon-reload
    echo "install $SEVICE_NAME service succ"
    return 0
}

Uninstall()
{
    if [ -z "$1" ];then
        echo "please input parame1:service name."
        return 1
    fi
    SEVICE_NAME=$1
    if [ ! -f $SYS_PATH/$SEVICE_NAME ]; then
        echo     "$SYS_PATH/$SEVICE_NAME not exist"
    fi
    
    if [ -f /etc/init.d/functions ]; then
        chkconfig --del $SEVICE_NAME
    elif [ -f /lib/lsb/init-functions ];then
        update-rc.d $SEVICE_NAME remove
    else
        echo "unrecognized sysv command"
        return 1
    fi
    rm -f $SYS_PATH/$SEVICE_NAME
    systemctl daemon-reload
    echo "uninstall $SEVICE_NAME service succ"
    return 0
}

Start()
{
    cd $EXE_PATH
#rm more core_dump file
    COUNT=1
    corefiles=`ls -t core-$EXE_NAME-*`
    for file in $corefiles
    do
        if [ $COUNT -gt $CORE_LIMIT_NUM ];then
            rm -rf $file
        fi
        let COUNT=$COUNT+1
    done
    
    if [ -f $PID_FILE ]; then
        echo "$SEVICE_NAME already running"    
        return 1
    fi
    ulimit -c unlimited
#start exe
    $EXE_PATH/$EXE_NAME &
    pid=`ps -ef|grep $EXE_PATH/$EXE_NAME|grep -v 'grep'|awk '{print $2}'`
    if [ -z $pid ]; then
        echo "$EXE_PATH/$EXE_NAME exec failed"
        return 1
    fi
    touch $PID_FILE
    echo $pid > $PID_FILE
    if [ $? -eq 0 ]; then
        echo "start $SEVICE_NAME service succ"
        return 0
    else
        echo "start $SEVICE_NAME service failed"
        return -1    
    fi
}

Stop()
{
    if [ ! -f $PID_FILE ]; then
        echo "$SEVICE_NAME not running"
        return 1    
    fi
    pid=`cat $PID_FILE`
    if [ -z $pid ]; then
        rm -rf $PID_FILE
        echo "$SEVICE_NAME not running"
        return 1
    fi
    kill $pid
    if [ $? -eq 0 ];then
        rm -rf $PID_FILE
        echo "stop $SEVICE_NAME service succ"
        return 0
    else
        echo "stop $SEVICE_NAME service failed"
        return 1    
    fi        
}
RETVAL=0
case $1 in
    install)
        Install $2 $3
        RETVAL=$?
        ;;
    uninstall)
        Uninstall $2
        RETVAL=$?
        ;;
    start)
        echo "enter Start"
        Start
        RETVAL=$?
        ;;
    stop)
        echo "enter Stop"
        Stop
        RETVAL=$?
        ;;        
esac
exit $RETVAL

安装服务:

  ./service.sh install 服务名称  可执行程序

卸载服务:

  ./service.sh unstall 服务名称

启动服务:

  systemctl start 服务名称

停止服务:

  systemctl stop 服务名称