[英]How to get this init.d script to start at server restart?
我正在按照在生產機器上安裝Redis的說明(使用chkconfig的CentOS)。
我給出的示例腳本需要參數start
實際啟動它,它似乎init.d不執行(傳遞參數)。
必須運行的真正命令是/etc/init.d/redis_6379 start
,但實際調用的是/etc/inti.d/redis_6379
,它只是說use start or stop as an argument
因此,當我的服務器重新啟動時,它實際上並不啟動redis。 我該怎么辦?
這是初始配置
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
#
# chkconfig: - 85 15
# description: Redis is a persistent key-value database
# processname: redis_6379
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
*)
echo "Please use start or stop as first argument"
;;
esac
確保通過chkconfig
添加腳本以進行服務管理。 使用chkconfig --list
查看列表並使用chkconfig --add scriptname
如果它不存在)。 之后配置您希望它被調用的運行級別。 我猜它是3,4和5所以: chkconfig --level 345 scriptname on
。
您應該告訴我們您是如何從init.d運行腳本的
但這是一個骯臟的解決方法:
改變線
start)
至
start|'')
如果沒有傳遞參數,這將啟動它。
如果你想通過命令行啟動服務,你也可以添加/etc/rc.d/rc.local
,而不是在init.d中創建服務文件。
Centos redis有一個帶有chkconfig標題行的init腳本,聲明它將在所有運行級別中啟動,這非常糟糕。 chkconfig用於管理/etc/rc.d中的符號鏈接
# chkconfig: - 85 15
我建議redis是在關鍵服務啟動后運行在3級的服務(例如sshd)。 在您的測試場景中,在開始生產之前重新啟動服務器。 如果redis無法啟動(剛剛發生),則無法在另一個運行級別啟動它來修復它。
如果你實現了正確的頭文件,你可以使用init和systemd(Fedora)
您應該將以下代碼添加到腳本/etc/inti.d/redis_6379
。 status
參數由命令service --status-all
。
# processname: redis_6379
# Source function library.
. /etc/init.d/functions
...
case "$1" in
status)
status -p $PIDFILE redis
script_result=$?
;;
init.d的日期已經編號了,wtf你還在讀這個嗎? 沒有更多的sudo service
,所有新的孩子都在syscrtl
現在當然在我工作的ubuntu 17.04服務器上,/ /etc/rc.local
甚至不存在
寫一個新的!
rc.local
真棒,特別是與unix風格的daemonize程序相結合......那兩個人,我幾乎可以稱它為一天。
但是,如果你想將rc.local
提升到一個新的水平,我將介紹我自己的個人redis init.d腳本背后的基本思想 - 我們在整個公司的生產服務器上使用的那個:
搶占有關系統套接字/文件限制的redis投訴
在一些linux中打了一針,並以持久的方式搞亂了sysconf
當我去睡午覺時,自動駕駛儀redis
#!/bin/sh
### BEGIN INIT INFO
# Provides: redis
# Required-Start: $syslog
# Required-Stop: $syslog
# Should-Start: $all
# Should-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: true
# Short-Description: start and stop redis
# Description: persistent key-value db
### END INIT INFO
NAME=redis
PATH=/opt/bin:/opt/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
EXEC=/opt/sbin/redis-server
CLIEXEC=/opt/sbin/redis-cli
CONF=/etc/$NAME/$NAME.conf
PIDFILE=/var/run/$NAME.pid
SOCKET=/var/run/$NAME.sock
PERF=/tmp/redis.sysctl
KERNELPG=/sys/kernel/mm/transparent_hugepage/enabled
[ -x /opt/sbin/redis-server ] || exit 0
set -e
# tune system for better redis performance
if [ ! -f $PERF ]; then
echo "tunning redis..." &>> $PERF
echo never > $KERNELPG && cat $KERNELPG &>> $PERF
sysctl -w net.core.somaxconn=65535 &>> $PERF
sysctl -w vm.overcommit_memory=1 &>> $PERF
echo "tuned." &>> $PERF && cat $PERF
fi
接下來,如果我們做得對:
讓我們有一個很好的慣用案例$ money number,專注於啟動和停止而不通過過多的PID跟蹤惡作劇進行排序
利用start-stop-daemon(即如果沒有父進程,不能通過父進程死亡來縮短)
case $1 in
start)
if [ ! -f $PIDFILE ]; then
echo -n "Starting $NAME: "
start-stop-daemon --start --pidfile $PIDFILE --exec $EXEC -- $CONF
echo "waiting for redis db to start..."
while [ ! -f $PIDFILE ]; do
sleep 0.1;
done
fi
PID=$(cat $PIDFILE)
echo "running with pid: $PID"
;;
stop)
if [ ! -f $PIDFILE ]; then
echo "redis is already stopped"
else
PID=$(cat $PIDFILE)
echo -n "Stopping $NAME: "
$CLIEXEC -s $SOCKET shutdown
echo "waiting for shutdown..."
while [ -x /proc/${PID} ]; do
sleep 0.1
done
echo "db stopped."
fi
;;
status)
if [ -f $PIDFILE ]; then
PID=$(cat $PIDFILE)
echo "running with pid: $PID"
else
echo "stopped."
fi
;;
restart|force-reload)
$0 stop && $0 start
;;
*)
echo "Argument \"$1\" not implemented."
exit 2
;;
esac
exit 0
redis.conf
以指定daemonize yes
。 讓redis成為管理PID文件狀態的主要責任方(如果你想知道為什么我們不必在腳本中對它做任何事情,除非從它那里讀取它) mkdir /etc/redis
echo 'daemonize yes' >> /etc/redis/redis.conf
echo 'pidfile /var/run/redis.pid' >> /etc/redis/redis.conf
mkdir /etc/redis
vim /etc/redis/redis # keep it traditional, no .sh extensions here
# saving buffers from root all damn day...
chmod a+x /etc/init.d/redis
update-rc.d redis defaults
conf
並install
以適合您。 大多數人可能想要刪除偵聽文件路徑,而不是為客戶端打開redis端口號的TCP堆棧,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.