crontab에서 redis 명령어 사용하기

crontab에서는 경로가 일반 shell script 사용하는 것처럼 실행되지 않기 때문에 경로를 절대경로를 사용하는 것이 좋다.

아래는 redis process를 확인하여 해당 포트의 process가 없을 경우 서버를 재실행시키고 master 서버를 cluster failover를 통해 다시 master로 변경시키는 스크립트이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash
REDIS_DIR=/home/user/redis
PASSWORD=my_password

REDIS_6001_CONF=${REDIS_DIR}/6001/redis_6001.conf
REDIS_6002_CONF=${REDIS_DIR}/6002/redis_6002.conf
REDIS_6101_CONF=${REDIS_DIR}/6101/redis_6101.conf

REDIS_PS=`ps -ef | grep redis`

if [[ $REDIS_PS != *"6001"* ]]; then
echo "6001 server off" >> ${REDIS_DIR}/redis_failover.log
redis-server ${REDIS_6001_CONF}
sleep 1s
redis-cli -p 6001 -a ${PASSWORD} cluster failover takeover
fi

if [[ $REDIS_PS != *"6002"* ]]; then
echo "6002 server off" >> ${REDIS_DIR}/redis_failover.log
redis-server ${REDIS_6002_CONF}
fi

if [[ $REDIS_PS != *"6101"* ]]; then
echo "6101 server off" >> ${REDIS_DIR}/redis_failover.log
redis-server ${REDIS_6101_CONF}
sleep 1s
redis-cli -p 6101 -a ${PASSWORD} cluster failover takeover
fi

그냥 스크립트를 실행하면 잘 실행된다.

하지만 crontab에 적용을 하면 redis_failover.log는 제대로 남지만 원하는 서버 실행은 실행되지 않는다.

그 이유는 redis-server, redis-cli를 실행시키지 못해서 생기는 일이다. (global로 명령어 설정이 되어있는데도 인식을 하지 못한다…)

그래서 redis-server, redis-cli의 절대경로를 찾아서 입력해주면 쉽게 해결된다.

1
2
3
4
5
# 절대경로 찾기
[user@localhost ~]$ which redis-server
/usr/local/bin/redis-server
[user@localhost ~]$ which redis-cli
/usr/local/bin/redis-cli
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# redis-server, redis-cli에 절대경로를 붙인 스크립트
#!/bin/bash
REDIS_DIR=/home/user/redis
PASSWORD=my_password
REDIS_ABSOLUTE_DIR=/usr/local/bin

REDIS_6001_CONF=${REDIS_DIR}/6001/redis_6001.conf
REDIS_6002_CONF=${REDIS_DIR}/6002/redis_6002.conf
REDIS_6101_CONF=${REDIS_DIR}/6101/redis_6101.conf

REDIS_PS=`ps -ef | grep redis`

if [[ $REDIS_PS != *"6001"* ]]; then
echo "6001 server off" >> ${REDIS_DIR}/redis_failover.log
${REDIS_ABSOLUTE_DIR}/redis-server ${REDIS_6001_CONF}
sleep 1s
${REDIS_ABSOLUTE_DIR}/redis-cli -p 6001 -a ${PASSWORD} cluster failover takeover
fi

if [[ $REDIS_PS != *"6002"* ]]; then
echo "6002 server off" >> ${REDIS_DIR}/redis_failover.log
${REDIS_ABSOLUTE_DIR}/redis-server ${REDIS_6002_CONF}
fi

if [[ $REDIS_PS != *"6101"* ]]; then
echo "6101 server off" >> ${REDIS_DIR}/redis_failover.log
${REDIS_ABSOLUTE_DIR}/redis-server ${REDIS_6101_CONF}
sleep 1s
${REDIS_ABSOLUTE_DIR}/redis-cli -p 6101 -a ${PASSWORD} cluster failover takeover
fi
Share