강좌/RaspberryPI 활용

라즈베리파이 Telegram BOT 만들기 4부 - Telegram CLI 데몬 실행 및 서비스 등록

acidpop 2015. 7. 21. 14:47
반응형

지난 글에 이어 이번에는 Telegram CLI 를 데몬으로 실행 하고 서비스에 등록하는 과정에 대해 알아보자.

 

 

지난번 글까지는 사용자가 직접 bin/telegram-cli 를 실행 하여서 수동으로 명령을 입력하거나 lua 스크립트를 읽어서 처리 하는걸

보고만 있어야 하는 문제가 있었다.

 

이번 강좌에서는 Telegram CLI를 Daemone Process 로 실행하고 라즈베리파이의 리눅스에서 서비스에 등록하는 과정을 알아보고

 

명령을 전달 받을 수 있는 TCP Socket 을 여는 과정, 그리고 Log 파일의 경로를 설정하는 부분까지 알아본다.

 

 


 

 

 

1. Telegram CLI 를 Daemon Process 로 실행 하는 방법.

 

 

Telegram CLI 를 데몬으로 띄우는 방법은 매우 간단하다.

 

다음 명령어를 이용해서 실행하면 된다.

 

[pi@/home/pi/tg]$ cd /home/pi/tg

[pi@/home/pi/tg]$ bin/telegram-cli -s bot/basicbot.lua -d &

 

기존에 bin/telegram-cli -s basicbot.lua 명령에서 "-d" 옵션과 "&" 기호가 추가 되었다.

 

-d 옵션은 telegram-cli 를 daemon 모드로 작동 시키는걸 의미하고 & 기호는 프로세스를 daemon 형태로 실행한다는 리눅스 명령이다.

 

데몬으로 실행하기는 이것으로 끝이다.

 

매우 간단하다.

 

 


 

 

 

2. Telegram CLI 소켓 열기와 로그 파일 경로 설정하기

 

Telegram CLI 를 사용하면서 의문점이 있었는데 Daemon 으로 실행된 Telegram-cli 에 메시지 전송을 명령하고 싶다면?

 

telegram-cli 프로세스를 하나 더 띄워서 보내나? 이건 좀 비효울적인거 같고.. 여러모로 좀 찾아 보니

 

Telegram CLI 자체내에서 Socket 을 지원한다.

 

--tcp-port/-P <port>                          port to listen for input commands
--udp-socket/-S <socket-name>        unix socket to create

 

최근 버전에는 udp socket 까지 지원을 한다.

 

이 강좌에서는 tcp socket 을 활용하는 방법을 소개 한다.

 

P(대문자) 옵션을 사용하는 방법은 다음과 같다.

 

[pi@/home/pi/tg]$ cd /home/pi/tg

[pi@/home/pi/tg]$ bin/telegram-cli -s bot/basicbot.lua -P 8888 -d &

 

-P 8888

 

위 명령어 옵션을 이용해 실행하면 telegram-cli 는 8888 포트를 열어 놓게 된다.

 

이 글을 보는 사용자 분들은 포트 번호를 원하는 번호로 사용하면 된다.

 

단, telegram cli 소스를 보면 local network, 즉 내부 네트워크만 접속 할 수 있게 되어 있다. 수정 할 수도 있지만 보안을 위해 그냥 쓴다. (수정 방법은 따로 공개하겠다, 링크)

 

 

자, 이제 TCP 포트를 열었으니 해당 포트로 메시지를 어떻게 전송 하는가?

 

그 방법은 netcat 을 이용하는 방법이다. netcat 은 라즈베리파이에 기본적으로 설치 되어 있다.

 

설치가 되어 있는지 확인 방법은 다음과 같다.

 

 

[pi@/home/pi/tg]$ nc --help

 

netcat 은 nc 라는 command 로 실행 할 수 있다.

 

만약 설치가  안되어 있다면 설치를 하자.

 

sudo apt-get install netcat

 

 

이번에는 netcat 을 이용하여 telegram cli 에 명령을 전달하는 방법이다.

 

[pi@/home/pi/tg]$ echo "msg 홍길동 메시지 전송합니다" | nc localhost 8888

 

 

echo 를 이용하여 출력 되는 문자열을 파이프를 이용해서 netcat 으로 전달한다.

netcat 은 입력 받은 문자열을 해당 포트로 전송한다.

 

echo 뒤에 telegram cli 에서 지원하는 명령어를 사용하여 메시지등을 전달 할 수 있다.

 

 

간혹 다음과 같은 오류를 볼 수도 있다.

ANSWER 31
FAIL: 38: can not parse arg #1

 

위 오류가 발생 하는 이유는 msg 다음의 이름을 인식 할 수가 없어서이다.

 

telegram cli 는 처음 실행 하고 나서 대상의 이름으로 전달을 하면 위와 같은 오류가 난다.

 

구글링을 해본 결과로는 "msg user#12345678 메시지" 이것처럼 user id 로 전송을 하라고 하는데 누가 저 숫자로 된 ID를 다 외운단 말인가..

 

여러 테스트를 해보니 다음 방법으로 해결이 가능하다.

 

contact_list

 

telegram cli 에서 위 명령이 한번 수행되고 난 다음에는 사용자 이름으로 메시지 전달이 가능했다.

 

그렇다면 telegram cli 를 시작할 때 매번 echo "contact_list" 이걸 해주어야 하는가? 아니다. Telegram CLI 옵션에 추가 할 수 있다.

 

 

[pi@/home/pi/tg]$ cd /home/pi/tg

[pi@/home/pi/tg]$ bin/telegram-cli -s bot/basicbot.lua -P 8888 -e "contact_list" -d &

 

바로 -e 옵션을 이용해서 수행할 명령어를 하나 전달하는것이다.

 

 

 

 


 

 

3. Telegram CLI 로그 파일 남기기

 

Telegram CLI 를 데몬으로 실행하면 이 프로세스가 제대로 작동하고 있는지..

 

메시지는 뭘 받았는지 알고 싶을때가 많을것이다.

 

즉, Telegram CLI 를 데몬으로 띄우지 않았을때 처럼 모든 처리 결과를 로그 파일로 남겨보자.

 

로그 경로를 설정하는 방법은 다음과 같다.

 

[pi@/home/pi/tg]$ cd /home/pi/tg

[pi@/home/pi/tg]$ bin/telegram-cli -s bot/basicbot.lua -P 8888 -e "contact_list" -L /var/log/telegram.log -d &

 

-L 옵션 뒤에 로그 파일 경로를 설정해 주었다.

 

단, /var/log/ 경로 아래에는 root 권한이 있어야만 읽고 쓸수가 있기 때문에 다음 명령어를 이용해서 로그 파일을 미리 생성하고 권한을 바꿔놓자.

 

[pi@/home/pi/tg]$ sudo sh -c  "echo '' > /var/log/telegram.log"

[pi@/home/pi/tg]$ sudo chown pi:pi /var/log/telegram.log

 

 

위와 같이 미리 로그 파일을 생성한 다음 Telegram CLI 를 실행하면 해당 로그 파일에 메시지들이 기록되는걸 확인 할 수 있다.

 

※주의사항 : 텔레그램 CLI를 많이 사용 하다 보면 로그 파일의 용량이 꽤 커지므로 주기적으로 관리가 필요하다.

 

 


 

 

4. Telegram CLI 서비스 등록하기

 

마지막으로 Telegram CLI 를 service 명령을 이용해서 실행하고 중단 하는 방법을 알아 보자.

 

 

일단 Telegram 을 실행, 정지, 상태 확인 할 수 있는 Shell Script 를 만들자.

 

다음 경로로 이동.

cd /home/pi/tg/

 

다음 소스를 복사하여 tg.sh 파일로 저장한다.

 

#!/bin/bash

TGPATH="/home/pi/tg"
TGBIN_PATH="/home/pi/tg/bin"
TGBIN_NAME="telegram-cli"
TGBOT_PATH="/home/pi/tg/bot/basicbot.lua"
TGLOG_PATH="/var/log/telegram-cli.log"
TGLISTEN_PORT=8888


function ProcChk()
{
    local ProcFile="$1"
    local ProcName="$2"
    PID=`/bin/ps -e -u 0 | /bin/grep -w $ProcFile | /usr/bin/awk '{print $1}'`
    if [ "$PID" ] ;  then
        printf "%16s : Running\n" "$ProcName";
    else
        printf "%16s : Stopped\n" "$ProcName";
    fi;
}

case "$1" in
start)
    echo "Starting Telegram CLI Daemon..."
    cd $TGPATH
    PID=`/bin/ps -e -u 0 | /bin/grep -w telegram-cli | awk '{print $1}'`

    if [ $PID ]; then
        echo "Telegram CLI Already Running"
        # exit 1
    else
        $TGBIN_PATH/$TGBIN_NAME -s $TGBOT_PATH -L$TGLOG_PATH -P $TGLISTEN_PORT -e "contact_list" -d &
        ProcChk "$TGBIN_NAME" "Telegram CLI Daemon"
    fi
    ;;
stop)
    echo "Telegram CLI safe stop Trying"
    `echo "safe_quit" | nc localhost 4500`

    PID=`/bin/ps -e -u 0 | /bin/grep -w telegram-cli | awk '{print $1}'`

    if [ -z $PID ]; then
        echo "Telegram CLI Already Stop"
        # exit 1
    else
        kill -9 $PID
    fi

    sleep 1
    ProcChk "$TGBIN_NAME" "Telegram CLI Daemon"
    ;;
chk)
    ProcChk "$TGBIN_NAME" "Telegram CLI Daemon"
    ;;
*)
    echo "Usage : `basename $0` [ start | stop | chk ]"
    ;;
esac

 

 

 

 

위 소스를 복사 해서 붙여넣거나 아래 파일을 다운로드 받아 /home/pi/tg 경로에 넣어놓는다.

 

 

tg.sh

 

파일을 다운로드 받아서 저장하는걸 추천한다.

 

위 소스 상에는 안보이지만 ANSI COLOR 문자가 포함되어 있어서 필요한 정보는 색깔을 이용해서 표시 하도록 되어 있다.

 

 

파일을 저장하다면 다음 명령어로 실행 권한을 준다.

 

 

[pi@/home/pi/tg]$ sudo chown pi:pi tg.sh

[pi@/home/pi/tg]$ chmod 755 tg.sh

 

아래 명령을 수행해보자.

./tg.sh status

 

다음과 같은 화면이 나온다면 쉘 스크립트가 정상적으로 작동하는 것이다.

 

[pi@/home/pi/tg]$ ./tg.sh chk
Telegram CLI Daemon : Running

 

또는

Telegram CLI Daemon : Stopped

 

Telegram 을 실행, 중단, 체크 할수 있는 스크립트가 만들어 졌다.

 

이제 서비스에 Telegram 을 등록하자.

 

다음 소소를 /etc/init.d/telegramd 파일로 저정한다.

 

 

#!/bin/bash
# /etc/init.d/telegramd

### BEGIN INIT INFO
# Provides:          telegram-cli
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: telegram cli daemon script
# Description:       Telegram CLI Daemon Script
### END INIT INFO

EXEC_ACCOUNT="pi"

case "$1" in 
    start)
        echo "Starting Telegram-cli Deamon"
    	su - $EXEC_ACCOUNT -c "/home/pi/tg/tg.sh start"
        ;;
    stop)
        #echo "Stopping Telegram-cli Daemon"
        su - $EXEC_ACCOUNT -c "/home/pi/tg/tg.sh stop"
        ;;
    restart)
        su - $EXEC_ACCOUNT -c "/home/pi/tg/tg.sh stop"
        su - $EXEC_ACCOUNT -c "/home/pi/tg/tg.sh start"
        ;;
    status)
	su - $EXEC_ACCOUNT -c "/home/pi/tg/tg.sh chk"
	;;
    *)
        echo "Usage: /etc/init.d/telegramd {start|stop|restart|status}"
        exit 1
        ;;
esac

exit 0

 

 

 

또는 아래 파일을 다운로드 하여 /etc/init.d/ 경로에 저장한다.

 

 

telegramd

 

 

해당 파일에 실행 권한을 준다.

 

sudo chmod 755 /etc/init.d/telegramd

 

여기까지 되었다면 service 명령으로 Telegram CLI 를 실행 하거나 중단 또는 현재 상태를 체크 할 수 있다.

 

사용 할 수 있는 옵션은 다음과 같다.

 

sudo service telegramd status

 

sudo service telegramd start

 

sudo service telegramd stop

 

sudo service telegramd restart

 

 

  Raspbian Jessie 사용자는 다음 링크를 이용해서 시작 프로그램을 등록 하시면 됩니다.

 

※ Raspbian Jessie 버전은 다음과 같은 메시지가 출력 되는 경우가 있다.

[pi@/home/pi/tg]$ sudo service telegramd status
● telegramd.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

 

    위와 같은 메시지가 보인다면 sudo reboot 명령을 이용해서 재부팅을 한번 하면 된다.

 

그리고 Raspbian Jessie 는 sudo service telegramd start 또는 stop 명령시 아래와 같은 화면이 보이지 않는다.

 

[pi@/home/pi/tg]$ sudo service telegramd start
Telegram CLI Daemon : Running

 

또는

Telegram CLI Daemon : Stopped

 

 

 

 


 

5. 라즈베리파이 부팅시 Telegram CLI 실행 되게 하기

 

chkconfig 를 설치한다.

 

sudo apt-get install chkconfig

 

chkconfig 가 설치 되었다면 Telegram CLI Service 를 부팅시 시작하도록 등록한다.

 

sudo chkconfig --add telegramd

 

 

다음 명령어를 이용해서 서비스가 등록되었는지 확인한다.

 

sudo chkconfig --list telegramd

 

telegramd                 0:off  1:off  2:on   3:on   4:on   5:on   6:off

 

위와 같이 2, 3, 4, 5에 on 이 되어 있다면 부팅시 실행이 되도록 등록이 되었다는 것이다.

 

 

 

 

 

 

여기까지 진행이 되었다면 Telegram CLI 를 좀 더 편리하게 사용 할 수 있을것이다.

 

다음 강좌부터는 Telegram BOT을 활용한 여러 기능들 중 날씨, 토렌트 검색기능 등을 포스팅 하겠다.

 

 

 

 

※ 궁금하신 사항들은 댓글이나 질문 게시판을 이용해서 남겨주세요 ^^

 

 

관련글