지난 글에 이어 이번에는 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 만들기 4부 - Telegram CLI 데몬 실행 및 서비스 등록 (35) | 2015.07.21 |
라즈베리파이 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 |
-
좋은글 공유해주셔서 진심으로 감사드립니다!
질문이있어서 댓글 남깁니다!
원래 basicbot.lua파일을 실행 시키는 명령어는 전 3부에서
bin/telegram-cli -s bot/basic.lua
표시 되어있는데
이번장
제일 첫줄 데몬실행 명령어에서
커맨더 두번째줄 명령어의
bin/telegram-cli -s basicbot.lua -d &
에서 표시가
bin/telegram-cli -s bot/basicbot.lua -d &
가 되어야 하지 않나 싶어 댓글남깁니다! -
-
Acidpop acidpop 2015.07.22 09:01 신고
랜덤한 숫자가 뜨는건 리눅스 시스템이
데몬으로 프로세스를 시작했을때 데몬으로 실행된 프로세스의 ID값 알려주는 내용입니다.
telegram-cli 뿐만 아닌 다른 모든 실행 프로그램도 맨 뒤에 & 기호를 붙이면 동일하게 숫자가 출력되는걸 확인 하실 수 있습니다 ^^
참고로 데몬으로 띄우면
ps -ef | grep telegram
위 명령으로 현재 telegram 이 실행 되어 있는지 확인 하실 수 있습니다.
-
-
질문 있어서 남깁니다! -d& 를 사용해 실행한 데몬을 끄는 명령어가 어떻게 되는지 알수있을지요...
그리고 계속해서 텔레그램 봇을 개발하기 위해서는 어떤방향으로 공부하는 것이좋을까요??
루아스크립트와 텔레그램 명령어들을 공부하려하는데 어떻게 해야할지 아직 부족한실력이라 조언을 해주실수있으신가요..-
Acidpop acidpop 2015.07.23 09:03 신고
안녕하세요.
ps -ef | grep tele
위 명령을 실행해보면 아래와 같이 나옵니다.
pi 7516 1 0 08:52 ? 00:00:01 /home/pi/tg/bin/telegram-cli
저 중에 pi 바로 뒤에 나오는 숫자 있죠?
kill -9 7516
이렇게 하시면 됩니다.
또는
sudo pkill telegram-cli
이렇게 하셔도 되구요 ^^
그리고 혹시 댓글 공개로 해주실수 있을까요? 다른분들도 참고가 될만한 질문이라 생각됩니다. -
Acidpop acidpop 2015.07.23 09:06 신고
Telegram BOT 에 대한 공부 방향은 제가 정확하게 방향을 제시하기에는 좀 광범위합니다 ^^;;
제가 활용하고 있는 BOT은 lua 스크립트가 기본으로 되고 내부에서 파이썬, C/C++로 작성된 프로그램, php 등등 다양한 환경에 맞게 사용을 하고 있거든요
자신이 가장 잘하는 언어로 실제 수행되는 프로그램을 개발하시고 lua 스크립트에서 호출 하는 방식으로 하시면 좋을거 같습니다
-
-
저는 실행하면 이런 메시지가 나오네요
1141064000 : 서울특별시 서대문구 홍제제3동
telegram-cli: lua-tg.c:1362: parse_lua_function: Assertion `pos + 3 + p < 1000' failed.
SIGNAL received
해결책이 없을까요?
-
Acidpop acidpop 2015.08.04 10:35 신고
rename_contact 명령을 lua 스크립트를 이용해서 하셨나요??
제가 보기에는 한글 주소를 파싱하다가 오류가 발생하는걸로 보입니다.
한글을 사용할때 큰 따옴표로 묶어서 해보시겠어요?
rename_contact 는 저도 테스트를 안해봤네요 ^^;
-
-
sudo service telegramd status 를 입력했을때 이 알림만 뜹니다.
/etc/init.d/telegramd: 2: /etc/init.d/telegramd: Syntax error: newline unexpected
-
Acidpop acidpop 2015.08.19 16:09 신고
블로그 내용중 첨부한 파일을 직접 받으셔서 한번 해보시겠어요?
복사/붙여 넣기 할때 잘못된 문자가 들어가는거 같습니다만..
-
-
예삐 2015.12.07 15:57
소켓으로 메세지 보내기를 하려는데
nc: getaddrinfo: Name or service not known
에러가뜹니다 ㅜㅜ 뭐가 문제죠??
-
Acidpop acidpop 2015.12.08 09:08 신고
어떤식으로 사용하셨나요?
nc localhost 이런 형태로 사용하셨는데 뜨는거라면
/etc/hosts 파일 내용중에
127.0.0.1 localhost
이런 줄이 있는지 확인해 보세요
아니면
nc 127.0.0.1 이런식으로 IP주소를 직접 써보세요
-
-
방준석 2016.04.20 15:15
service telegramd status
● telegramd.service
Loaded: not-found (Reason: No such file or directory)
Active: inactive (dead)
이렇게 나오는데 어떻게 해야하나요?
-
Acidpop acidpop 2016.04.20 15:48 신고
안녕하세요.
아래 경로에 telegramd 라는 파일은 있나요?
/etc/init.d/telegramd
실행 환경은 Raspbian 인가요?
-
-
-
이현우 2016.07.25 09:53
강좌를 끝까지 따라햇는데
라즈베리를 부팅시 daemon 이 정상적으로 실행되는것 같다가 스스로 stop 시키는거 같은데 이럴경우 어디를 고쳐줘야할까요?
service restart 할시 다시 작동합니다-
Acidpop acidpop 2016.07.25 15:31 신고
안녕하세요
제가 봇을 개발할 당시에는 Wheez 를 사용 했었고 Jessie 버전에서는 충분한 테스트가 안되었네요.
Jessie 버전에서 시작 프로그램 등록 하는 방법을 포스팅 하였으니 해당 글을 참고해주세요
http://blog.acidpop.kr/233
-
스롱우니 2016.12.03 00:45
안녕하세요 라즈베리파이 처음사용해보는 많은도움이 되고있습니다. 그런데 안되는 점이 있어서 질문드립니다.
Telegram CLI 소켓 열기와 로그 파일 경로 설정하기 할때 bin/telegram-cli -s bot/basicbot.lua -P 8888 -d &을 치면
어떻게 나와야하나요? 저는 [1] 2191 두번치면 [2] 2192식으로나오는데 일단은 이부분은 넘어가서 echo 메세지를 전송합니다해서
말씀하신거와 같이 오류가 나고있는데 contact_list를 치니까 이미 사용하고 있는 주소라고 나오더라고요ㅜㅜ
그래서 sudo pkill telegram-cli 이걸로 다끄고 다시해도 이미사용중이라고뜨는데 혹시 어디를 고쳐야할까요?-
Acidpop acidpop 2016.12.05 09:18 신고
안녕하세요.
-d 옵션은 telegram-cli 를 데몬 모드로 사용하겠다 라는 의미 이고
맨 마지막에 & 기호는 리눅스 상에서 해당 프로그램을 데몬으로 실행 하겠다 라는 의미 입니다.
처음 실행 하고 [1] 2191 같이 숫자가 나오면 프로그램이 실행 되었고 해당 프로그램의 Process ID 는 2191 이다 라는걸 알려주는거에요.
즉, 이미 백그라운드에 실행이 되고 있다는 뜻입니다.
그런데 한번더 실행을 하게 되면 중복 실행이 되버리는건데 그럴때는 오류가 발생 할수 있죠.
ps -ef | grep telegram 명령을 실행하셔서
해당하는 pid 는 모두
pkill -9 pid값
명령으로 종료 하신 다음 한번만 실행해서 테스트 해보세요
-
-
스롱우니 2016.12.03 01:05
데몬이랑 로그파일 부분이 잘안되는데 서비스등록만 해도 문제없나요? Jessie버전으로 사용을 하는중이여서 데몬 로그부분 빼고 바로 서비스 등록만 하고있는데 systemtl~~~~부분을 치면 부적절한옵션이라고 뜨는데 데몬이랑 로그부분 다해야하는건가요?
-
Acidpop acidpop 2016.12.05 09:19 신고
Jessie 버전에서는 systemctl 을 이용해야
http://blog.acidpop.kr/233
이 링크를 참고 하시고 "seohyeon" 님이 댓글로 남겨주신 방법을 참고하셔야 합니다.
-
-
안녕하세요 지금 따라하고있는대
sudo service telegramd status 를 실행하면
● telegramd.service
Loaded: not-found (Reason: No such file or directory)
Active: inactive (dead)
이렇게 뜨는대 어떻게 해야되나여?
파일 경로도 /etc/init.d 이곳으로 되어있거든여
-
bin/telegram-cli -s bot/basicbot.lua -P 8888 -d & 입력시 뒤에 [1] 4224같이 숫자들이 나오는대 무엇인가여??
-
bin/telegram-cli -s bot/basicbot.lua -P 8888 -e "contact_list" -d &
이 명령어 실행시
bind: Address already in use
라고 뜹니다 .. 어떻해야되져 ㅠㅠ
-
Acidpop acidpop 2017.04.10 10:21 신고
8888 이라는 포트를 이미 사용 하고 있다는 뜻입니다.
sudo netstat -nap | grep 8888
하셔서 어떤 프로세스가 사용하는지 확인해 보세요 -
Acidpop acidpop 2017.04.10 10:22 신고
아니면 telegram-cli 프로세스를 종료하지 않고 다시 실행 하게 되어서 그런것일수도 있습니다.
-