지난 글에 이어 이번에는 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 을 지원한다.
--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 은 라즈베리파이에 기본적으로 설치 되어 있다.
설치가 되어 있는지 확인 방법은 다음과 같다.
netcat 은 nc 라는 command 로 실행 할 수 있다.
만약 설치가 안되어 있다면 설치를 하자.
sudo apt-get install netcat
이번에는 netcat 을 이용하여 telegram cli 에 명령을 전달하는 방법이다.
echo 를 이용하여 출력 되는 문자열을 파이프를 이용해서 netcat 으로 전달한다.
netcat 은 입력 받은 문자열을 해당 포트로 전송한다.
echo 뒤에 telegram cli 에서 지원하는 명령어를 사용하여 메시지등을 전달 할 수 있다.
간혹 다음과 같은 오류를 볼 수도 있다.
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]$ 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 경로에 넣어놓는다.
파일을 다운로드 받아서 저장하는걸 추천한다.
위 소스 상에는 안보이지만 ANSI COLOR 문자가 포함되어 있어서 필요한 정보는 색깔을 이용해서 표시 하도록 되어 있다.
파일을 저장하다면 다음 명령어로 실행 권한을 준다.
아래 명령을 수행해보자.
./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/ 경로에 저장한다.
해당 파일에 실행 권한을 준다.
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
위와 같이 2, 3, 4, 5에 on 이 되어 있다면 부팅시 실행이 되도록 등록이 되었다는 것이다.
여기까지 진행이 되었다면 Telegram CLI 를 좀 더 편리하게 사용 할 수 있을것이다.
다음 강좌부터는 Telegram BOT을 활용한 여러 기능들 중 날씨, 토렌트 검색기능 등을 포스팅 하겠다.
※ 궁금하신 사항들은 댓글이나 질문 게시판을 이용해서 남겨주세요 ^^
2015/07/16 - [강좌/Raspberry PI 활용] - 라즈베리파이 Telegram BOT 만들기 2부 - Telegram cli 기초 사용법
2015/07/16 - [강좌/Raspberry PI 활용] - 라즈베리파이 Telegram BOT 만들기 3부 - Telegram cli BOT 의 뼈대 만들기
'강좌 > RaspberryPI 활용' 카테고리의 다른 글
Raspberry Pi DSI Display Multi Touch (0) | 2015.09.22 |
---|---|
유튜브 다운로드 (0) | 2015.09.01 |
라즈베리파이 Telegram - PHP를 이용하여 메시지 보내기 (7) | 2015.08.13 |
라즈베리파이 Telegram BOT 만들기 5부 - Telegram CLI BOT 최종 (27) | 2015.07.22 |
라즈베리파이 Telegram BOT 만들기 3부 - Telegram cli BOT 의 뼈대 만들기 (22) | 2015.07.16 |
라즈베리파이 Telegram BOT 만들기 2부 - Telegram cli 기초 사용법 (3) | 2015.07.16 |
라즈베리파이 Telegram BOT 만들기 1부 - Telegram cli 설치 (29) | 2015.07.15 |
Raspberry pi watchdog auto reboot 설정 (2) | 2015.07.15 |