#!/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
Unix StackExchangeへようこそ。
Redisにすでに存在するシステム単位ファイルの1つから始めることをお勧めします。作成と共有?
systemdには、bashで以前にコード化された多くの機能のサポートが組み込まれているため、直接翻訳を試すことは必要以上に困難です。
User=
ディレクティブは、実行するユーザーを設定します。start-stop-daemon
不要- 明示的なPidfile管理は必要ありません。
systemd
適切な PATH 変数が既に設定されているので、必要はありません。systemd
リソースを制御するにはさまざまなオプションがあるため、ulimitを呼び出す必要はありません。man systemd.resource-control
すべてのオプションを確認してください。
これらすべての理由により、オンラインで見つけることができるサンプルファイルはredis.service
かなり短いです。
Systemd は、限られた場合にのみ環境変数の置換をサポートします。man systemd.service
ドキュメントで「環境変数の置換」を検索するときの詳細について説明します。