init.d 스크립트를 systemd로 포팅합니다.

init.d 스크립트를 systemd로 포팅합니다.
#!/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON="/usr/local/bin/redis-server"
PIDFILE="/var/run/redis/redis_7128.pid"
RUNDIR="/var/run/redis"
REDIS_USER="redis"
DAEMON_ARGS="/etc/redis/redis_7128.conf"
REDISPORT="7128"

case "$1" in
  start)
        echo -n "Starting $DAEMON: "
        touch $PIDFILE
        chown redis:redis $PIDFILE
        chmod 755 $RUNDIR

        if [ -n "$ULIMIT" ]
        then
                ulimit -n $ULIMIT
        fi

        if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid $REDIS_USER:$REDIS_USER --exec $DAEMON -- $DAEMON_ARGS
        then
                echo "$NAME."
        else
                echo "failed"
        fi
        ;;
  stop)
        echo -n "Stopping $DESC: "
        if start-stop-daemon --stop --retry forever/TERM/1 --quiet --oknodo --pidfile $PIDFILE --exec $DAEMON
        then
                echo "$NAME."
        else
                echo "failed"
        fi
        rm -f $PIDFILE
        sleep 1
        ;;

  restart|force-reload)
        ${0} stop
        ${0} start
        ;;

  status)
        echo -n "$DESC is "
        if start-stop-daemon --stop --quiet --signal 0 --name ${NAME} --pidfile ${PIDFILE}
        then
                echo "running"
        else
                echo "not running"
                exit 1
        fi
        ;;

  *)
        echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload|status}" >&2
        exit 1
        ;;
esac

exit 0

에 대해 위의 스크립트를 작성했습니다 init.d. 로 이식하고 싶습니다 systemd.

직접 작성해서 저장해봤는데 /etc/systemd/system/redis.service변수가 확장되지 않네요

[Unit]
Description=My Redis Service

[Service]
Type=forking
#User=redis
Restart=on-failure
RemainAfterExit=yes
EnvironmentFile=/etc/systemd/system/redisenv
ExecStart=start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid $REDIS_USER:$REDIS_USER --exec $DAEMON -- $DAEMON_ARGS
ExecStart=echo -n "Starting $DAEMON: "
ExecStart=touch $PIDFILE
ExecStart=chown redis:redis $PIDFILE
ExecStart=chmod 755 $RUNDIR
ExecStart=if [ -n "$ULIMIT" ];then ulimit -n $ULIMIT ;fi  
ExecStart=if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid $REDIS_USER:$REDIS_USER --exec $DAEMON -- $DAEMON_ARGS ;then echo "$NAME." ; else echo "failed"; fi  

ExecStop=start-stop-daemon --stop --retry forever/TERM/1 --quiet --oknodo --pidfile $PIDFILE --exec $DAEMON

[Install]
WantedBy=multi-user.target

EnvironmentFile포팅할 때 썼던 내용은 저장해뒀어요/etc/systemd/system/redisenv

SECRET=pGNqduRFkB4K9C2vijOmUDa2kPtUhArN
ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/bin/redis-server
PIDFILE=/var/run/redis/redis_6382.pid
RUNDIR=/var/run/redis
REDIS_USER=redis
DAEMON_ARGS=/etc/redis/redis_6382.conf
REDISPORT=6382

그럼 내가 그랬어

sudo chmod 777 /etc/systemd/system/redis.service
sudo chmod 777 /etc/systemd/system/redisenv
sudo systemctl daemon-reload
sudo systemctl start redis-service

하지만 그것은 돌아온다

Failed to start redis.service: Unit redis.service is not loaded properly: Invalid argument. 
See system logs and 'systemctl status redis.service' for details.

그리고 sudo systemctl status redis.service돌아오다

● redis.service - My Redis Service                                                                                                                                                                                                                                            
   Loaded: error (Reason: Invalid argument)                                                                                                                                                                                                                                   
   Active: inactive (dead)

Aug 14 19:11:31 squid2 systemd[1]: [/etc/systemd/system/redis.service:16] Executable path is not absolute, ignoring: if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid $REDIS_USER:$REDIS_USER --exec $DAEMON -- $DAEMON_ARGS ;then echo "$NAME." ; 
Aug 14 19:11:31 squid2 systemd[1]: redis.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
Aug 14 19:11:37 squid2 systemd[1]: [/etc/systemd/system/redis.service:10] Executable path is not absolute, ignoring: start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid $REDIS_USER:$REDIS_USER --exec $DAEMON -- $DAEMON_ARGS
Aug 14 19:11:37 squid2 systemd[1]: [/etc/systemd/system/redis.service:11] Executable path is not absolute, ignoring: echo -n "Starting $DAEMON: "
Aug 14 19:11:37 squid2 systemd[1]: [/etc/systemd/system/redis.service:12] Executable path is not absolute, ignoring: touch $PIDFILE
Aug 14 19:11:37 squid2 systemd[1]: [/etc/systemd/system/redis.service:13] Executable path is not absolute, ignoring: chown redis:redis $PIDFILE
Aug 14 19:11:37 squid2 systemd[1]: [/etc/systemd/system/redis.service:14] Executable path is not absolute, ignoring: chmod 755 $RUNDIR
Aug 14 19:11:37 squid2 systemd[1]: [/etc/systemd/system/redis.service:15] Executable path is not absolute, ignoring: if [ -n "$ULIMIT" ];then ulimit -n $ULIMIT ;fi
Aug 14 19:11:37 squid2 systemd[1]: [/etc/systemd/system/redis.service:16] Executable path is not absolute, ignoring: if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid $REDIS_USER:$REDIS_USER --exec $DAEMON -- $DAEMON_ARGS ;then echo "$NAME." ; 
Aug 14 19:11:37 squid2 systemd[1]: redis.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.

스크립트를 init.d이식하는 데 도움이 되었나요 systemd?

제가 본 첫 번째 문제는 변수가 변수가 아니고 스크립트의 확장이 일어나지 않는다는 것입니다

답변1

유닉스 StackExchange에 오신 것을 환영합니다.

Redis에 대해 이미 존재하는 시스템 단위 파일 중 하나로 시작하는 것이 좋습니다.생성 및 공유?

systemd에는 이전에 bash에서 코딩된 많은 기능에 대한 지원이 내장되어 있기 때문에 직접 번역을 시도하는 것이 필요 이상으로 어렵습니다.

  • User=지시문은 실행되는 사용자를 설정합니다.
  • start-stop-daemon불필요한
  • 명시적인 Pidfile 관리가 필요하지 않습니다.
  • systemd적절한 PATH 변수가 이미 설정되어 있으므로 그럴 필요가 없습니다.
  • systemd리소스를 제어하는 ​​데는 다양한 옵션이 있으므로 ulimit를 호출할 필요가 없습니다. man systemd.resource-control모든 옵션을 검토하세요 .

이러한 모든 이유로 인해 온라인에서 찾을 수 있는 예제 파일은 redis.service다소 짧습니다.

Systemd는 제한된 경우에만 환경 변수 대체를 지원합니다. man systemd.service문서에서 "환경 변수 대체"를 검색할 때 자세한 내용을 다룹니다.

관련 정보