systemctl 로 telegram service 를 시작 하면 봇이 응답을 받지 않는 문제가 있네요...ㅠㅠ

 

해결 방법을 찾아 보고 있습니다.

 

혹여 잘 아시는 분은 댓글로 도움 부탁드립니다.


 

 

 

기존에 Telegram CLI 데몬을 등록하는 글을 작성한게 있는데 최근(?) Raspbian Wheez 에서 Raspbian Jessie 로 업데이트가 되면서

 

서비스를 관리하는 프로세스가 변경이 되었다. 리눅스의 커널이 올라가면서 init 프로세스에서 systemd 로 변경이 되었는데

 

사용법이 많이 달라져있다.

 

init 과 systemd 차이 또는 사용법은 구글링 해보면 많이 나오니 이 블로그에서는 Telegram CLI 를 어떻게 등록 하는지에 대해서만 포스팅 한다.

 

 

이 글의 라즈베리 파이 시작 프로그램 작성 방법은 Raspbian Jessie 버전에서 작동합니다.

 


 

 

기존에는 /etc/init.d/telegramd  라는 파일 이름으로 스크립트를 등록해서 사용 했었으나 이젠 해당 스크립트는 필요 없고 다음 순서대로 하면 된다.

 

1. telegram.service 파일 작성하기.

 

일단 Telegram CLI 를 pi 계정에서 사용하는 가정하에 다음과 같이 디렉토리를 생성한다.

 

 

[pi@/home/pi]$ mkdir -p /home/pi/.config/systemd/user

[pi@/home/pi]$ cd /home/pi/.config/systemd/user

 

디렉토리를 생성 하고 해당 경로로 이동한다.

 

vi 또는 nano 에디터를 이용해서 다음 내용의 파일을 telegram.service 파일로 생성한다.

 

[Unit]
Description=Telegram CLI Daemon

 

[Service]
Type=forking
ExecStart=/home/pi/tg/tg.sh start
ExecStop=/home/pi/tg/tg.sh stop

 

[Install]
WantedBy=default.target

 

빨간색 글씨로 표시된 부분은

 

2015/07/21 - [강좌/RaspberryPI 활용] - 라즈베리파이 Telegram BOT 만들기 4부 - Telegram CLI 데몬 실행 및 서비스 등록

 

이 링크에서 4. Telegram CLI 서비스 등록하기

 

에서 설명한 셀 스크립트를 그대로 활용 하는 부분이므로 해당 링크 글을 참조 한다.

 

위 내용을 저장하면 telegram.service 라는 파일이

 

/home/pi/.config/systemd/user/telegram.service 경로에 저장 된다.

 

이제 systemd 에 등록할 차례 이다.

 

2. 서비스 등록 하기

 

[pi@/home/pi]$ systemctl --user enable telegram.service

 

 

3. 서비스 시작 하기

 

[pi@/home/pi]$ systemctl --user start telegram.service

 

 

4. 서비스 상태 확인 하기

 

[pi@/home/pi]$ systemctl --user status telegram.service

 

 

 

 

[pi@/home/pi]$ systemctl --user status telegram.service

● telegram.service - Telegram CLI Daemon
   Loaded: loaded (/home/pi/.config/systemd/user/telegram.service; enabled)
   Active: active (running) since Mon 2016-07-25 15:03:26 KST; 18min ago
  Process: 702 ExecStart=/home/pi/tg/tg.sh start (code=exited, status=0/SUCCESS)
 Main PID: 707 (telegram-cli)
 

 

active(running) 이 되어 있는지 확인 한다.

 

 

[pi@/home/pi]$ ps -ef | grep telegram

pi         707   697  0 15:03 ?        00:00:00 /home/pi/tg/bin/telegram-cli -s /home/pi/tg/bot/basicbot.lua -L/var/log/telegram-cli.log -P 8080 -e contact_list -d
pi         885   716  0 15:24 pts/0    00:00:00 grep --color=auto telegram

 

위 명령어를 이용해서 Telegram CLI 프로세스가 실행 되고 있는지도 확인한다.

 

 

모든 과정이 끝났다.

 

이젠 라즈베리파이를 재부팅 해보고 Telegram CLI 가 부팅시 시작 되는지 확인해 본다.

  1. seohyeon 2016.11.27 16:20

    systemctl로 telegram service를 실행할 경우 telegram 봇은 인증부터 들어갑니다. 왜냐하면 systemctl이 찾고 있는 ~/.telegram-cli/는 저희가 위차가 /home/pi가 아닌 /root/.telegram-cli를 주목하고 있습니다. 그렇게 되면 telegram-cli.log는 사용자에게 [인증된 파일이 없습니다!]를 요청하게 되는거죠. 권한을 조금씩 수정하면 되긴 하지만 저 같은 경우에는 ~/tg 디렉토리와 ~/.telegram-cli 디렉토리를 /root 밑에 두고 tg.sh의 변수에서 설정한 경로와 telegram.service의 절대경로를 변경하여 해결하였습니다! 저보다 더 좋은 해결 방법을 알고 계시다면 댓글을 써주세요!

    • BlogIcon Acidpop acidpop 2016.12.05 09:20 신고

      제가 systemctl 을 제대로 이해하지 못하고 사용을 해서 그랬었군요.

      정말 좋은 정보 감사합니다.

    • BlogIcon xoskd 2017.03.25 21:48 신고

      root 폴더 접근이 허가가 안되는대 접근을 어떻게 해야되나여?

  2. bestbefore 2017.02.11 08:31

    라즈베리파이 3 Jessie 사용중입니다.

    자꾸 daemon 이 stopped 되어 작동을 안하는 문제가 있습니다.

    해당 글에 댓글대로 , ~/tg 폴더와 ~/.telegram-cli 폴더를 전부 /root 폴더 아래에 복사시켰습니다.

    tg.sh 같은 경우도

    ExecStart=/root/tg/tg.sh start
    ExecStop=/root/tg/tg.sh stop

    로 경로를 변경시켰습니다.

    telegram.service 역시

    [Service]
    Type=forking
    ExecStart=/root/tg/tg.sh start
    ExecStop=/root/tg/tg.sh stop

    로 경로를 변경시켰습니다.

    문제는 터미널에서 systemctl --user start telegram.service 를 실행시켰을때 에러가납니다

    Active: failed (Result: exit-code)
    Process: 1548 ExecStart= /root/tg/tg.sh start (code=exited, status=203/EXEC)

    라고 합니다.

    root 폴더가 일반적으로 접근허용이 안되있어서 그런가보다 하고 LXTerminal 에서 실행시켰는데 그래도 결국 실패했습니다;;

    systemctl --user enable telegram.service 라는 명령을 내렸을 때,

    Failed to get D-Bus connection: 명령을 허용하지 않음 이라고하네요

    혹시 이런 문제들에 대한 해결방법이나 조언 부탁드립니다.

    • BlogIcon Acidpop acidpop 2017.02.13 10:36 신고

      systemctl 명령을 사용하실때
      pi 계정에서 사용을 하셨나요?
      맨 앞에 sudo 명령을 붙여서 실행해보세요

  3. bestbefore 2017.02.14 05:13

    따로 계정을 생성하거나 추가/변경 시킨것은 없습니다.

    뭔가 꼬인거같아서 전부 지우고, 시작부터 /root 폴더에 전부 생성하였습니다.

    daemon 은 Running 상태이며, 8888포트로 메시지도 전달이 가능합니다.

    문제는 systemctl --user enable telegram.service 명령어가 여전히 먹히지 않습니다.

    LXTerminal 에서 sudo systemctl --user enable telegram.service 를 입력시 이번에는
    Failed to get D-Bus connection: 연결이 거부됨 이라고 합니다.

    일반 Terminal 에서 systemctl --user enable telegram.service 를 실행해보니 뭔가 telegram.service가 실행되었다고는 합니다.
    문제는, systemctl -- user start telegram.service 입력시 에러가 납니다.
    에러 내용은 :

    Job for telegram.service failed. See 'systemctl status telegram.service' and 'journalctl -xn' for details. 라고 하며

    systemctl --user enable telegram.service 입력시

    Loaded : loaded
    Active : failed (Result : exit-code)
    Process : 1647 ExecStart =/root/tg/tg.sh start( code =excited, status=203/EXEC)
    라고 합니다.


    telegram.service 를 라즈베리파이에 기본 설치되어있는 Text Editor로 만들었는데, 혹시 nano 에디터로 파일을 생성해야하는가요?
    아니면 chmod 로 실행권한을 줘야하나요?

    • BlogIcon Acidpop acidpop 2017.02.14 09:37 신고

      글쎄요...
      저도 systemctl 을 사용하고 있지 않아서
      정확한 답변을 드리기가 어렵습니다. ㅠㅠ

  4. BlogIcon xoskd 2017.03.25 22:16 신고

    Active: inactive (dead) 서비스 상태확인을하면 이글이 나옵니다

  5. xoskd 2017.04.10 13:37

    systemctl --user start telegram.service 실행시
    Job for telegram.service failed. See 'systemctl status telegram.service' and 'journalctl -xn' for details. 이렇게 뜨고
    앞에 sudo를 넣고 실행시에는
    Failed to get D-Bus connection: 연결이 거부됨
    연결이 거부됫다고 뜨네여

    • BlogIcon Acidpop acidpop 2017.04.10 13:53 신고

      일단
      /home/pi/.config/systemd/user/telegram.service

      이 파일이 정확히 있는지 확인해주시고
      이 파일 내용이

      [Unit]
      Description=Telegram CLI Daemon

      [Service]
      Type=forking
      ExecStart=/home/pi/tg/tg.sh start
      ExecStop=/home/pi/tg/tg.sh stop

      [Install]
      WantedBy=default.target


      위와 같이 되어 있는지 확인 하신 다음

      /home/pi/tg/tg.sh 파일이 있는지
      그리고 tg.sh start 또는 stop 이 제대로 작동하는지 확인 해주세요

      제 라즈베리파이에 설치된 버전은
      4.4.38-v7+ #938

      Raspbian GNU/Linux 8 (jessie)

      버전입니다.

      현재 제 시스템에서는

      systemctl --user start telegram.service

      위 명령 실행시 아무 메시지도 나오지 않고
      정상적으로 실행이 되어 있습니다.

      systemctl --user status

      위 명령을 실행 하면 아래와 같이 나옵니다.

      telegram.service
      ● telegram.service - Telegram CLI Daemon
      Loaded: loaded (/home/pi/.config/systemd/user/telegram.service; disabled)
      Active: active (running) since Mon 2017-04-10 13:45:41 KST; 5s ago
      Process: 23150 ExecStart=/home/pi/tg/tg.sh start (code=exited, status=0/SUCCESS)
      Main PID: 23156 (telegram-cli)
      CGroup: /user.slice/user-1000.slice/user@1000.service/telegram.service
      └─23156 /home/pi/tg/bin/telegram-cli -s /home/pi/tg/bot/acidpopbot.lua -L/var/log/telegram-cli.log -P 8888 -e contact_list -d


      혹시 user 디렉토리를 본인 ID 로 만드신건 아니신지요

  6. BlogIcon xoskd 2017.04.10 23:10 신고

    pi@raspberrypi:~ $ systemctl --user status telegram.service
    ● telegram.service - Telegram CLI Daemon
    Loaded: loaded (/home/pi/.config/systemd/user/telegram.service; enabled)
    Active: inactive (dead) since 월 2017-04-10 22:18:09 KST; 40s ago
    Process: 8743 ExecStop=/home/pi/tg/tg.sh stop (code=exited, status=0/SUCCESS)
    Process: 8738 ExecStart=/home/pi/tg/tg.sh start (code=exited, status=0/SUCCESS)

    Warning: Unit file changed on disk, 'systemctl --user daemon-reload' recommended.
    실행시 이렇게 뜹니다
    파일다 제대로있고 경로도 같습니다

    • BlogIcon xoskd 2017.04.10 23:11 신고

      user 디텍토리 본인 ID라는건 뭔지 잘 모르겠네여
      Linux raspberrypi 4.4.50-v7+ #970
      라즈베리 설치버전입니다

    • BlogIcon xoskd 2017.04.10 23:15 신고

      혹시 라즈베리파이 설정에
      boot 값을 To Desktop 에서
      To CLI로 변경해야되나여?

    • BlogIcon Acidpop acidpop 2017.04.10 23:39 신고

      일단 systemctl 을 꼭 사용하셔야 할 이유가 있나요?
      굳이 필요 없으시다면
      /etc/rc.local

      을 vim 등의 편집기를 이용해 수정해주세요

      sudo vim /etc/rc.local

      exit 0 바로 윗 라인에

      su - pi -c "/home/pi/tg/tg.sh start"

      이 명령을 추가해 주시면
      부팅시 telegram-cli 가 실행 됩니다.


      그리고 실행 상태 여부는
      /home/pi/tg/tg.sh chk

      이 명령으로 체크하세요

      systemctl 쓰지 않으시는걸 추천드려요

    • BlogIcon xoskd 2017.04.10 23:42 신고

      #Make sure that the script will "exit 0" on success or any other
      이 문장 위에다가
      su - pi -c "/home/pi/tg/tg.sh start"
      이줄을 추가시키면되나여??

    • BlogIcon Acidpop acidpop 2017.04.10 23:54 신고

      맨 아래에 보시면 exit 0 가 있습니다

      그거 바로 위에 써주시면 되요

  7. gawoon 2017.10.02 21:04

    위와 같이 해도 안되어서 raspberrypi.org에서 해답을 찾았습니다.
    파이가 너무 빨라져서 생기는 문제인것 같습니다. ^^;
    /etc/rc.local 파일에 아래 두 줄을 삽입해서 해결했습니다.
    sleep 15
    su - pi -c "/home/pi/tg/tg.sh start"


날씨가 풀리면서 미세먼지, 초미세먼지등 대기 질이 안좋아 지는 시기가 오는군요.

 

텔레그램 봇과 openapi 를 이용해서 7, 11, 15, 19시에 각각 통합대기, 미세먼지, 초미세먼지 수치를

 

그림으로 알려주는 채널입니다.


https://telegram.me/airkorea


 

 

 

 

 

 

디자인이 개발자 디자인이라 좀 조악합니다만 그럭저럭 볼만합니다.

 

혹시 더 좋은 디자인을 제공해 주시면 반영하도록 해보겠습니다.

 

 

 

기존에 XPEnology SMS 알림을 텔레그램으로 보내기 라는 글을 포스팅 했었다.

 

http://blog.acidpop.kr/207

 

하지만 이 글은 라즈베리 파이에 Telegram CLI 를 설치 하고...

 

새로운 사용자 계정을 만들어야 하고(폰 번호 필요)

 

php 까지 연동을 해야 하는 복잡한 구조였으나!!

 

 

최근 Telegram BOT 관련해서 약간의 개발을 진행 하고 문서를 살펴 보다 보니

 

Telegram BOT API URL 로 한번에 전송 할 수 있다는것을 알게 되었다.

 

다음 순서 대로 진행 하면 다른 설정 필요 없이 단순하게 URL 만 붙여넣기 하여 SMS 알림을 텔레그램으로

 

보낼 수 있다.

 

 


 

1. Telegram BOT 계정 만들기

http://blog.acidpop.kr/215

Telegram BOT 은 폰 번호가 필요 없다. 위 링크를 참고하여 봇 계정을 생성하자.

 

2. chat ID 값 알아오기

http://blog.acidpop.kr/216

위 링크를 참고하여 본인의 chat_id 값을 알아오자.

 

3. XPEnology 에서 알림 설정 하기.




  제어판에서 알림으로 들어가서 SMS 탭을 선택 한다.


  중간쯤에 SMS 서비스 제공업체 추가 버튼을 클릭한다.



https://api.telegram.org/bot186547547:AAEXOA9ld1tlsJXvEVBt4MZYq3bHA1EsJow/sendMessage?user=1&pass=1&phone=010&chat_id=12345678&text=Hello World


위 주소를 복사하여 빨간색으로 표시된 BOT Token 과 chat_id 값만 생성한 봇의 Token 값과 chat_id 값으로


변경해준 다음 붙여 넣기 한 후 다음 버튼을 클릭한다.


공급자 이름은 사용자가 원하는대로 써주면 된다.


text=Hello World 에서 띄어쓰기를 삭제 하면 작동하지 않는다.

 




4. 각 매개변수에 대해 해당하는 범주 선택 창에서 아래와 동일하게 설정 해준다.





5. 아래쪽에 있는 적용 버튼을 누른 다음 "테스트 SMS 메시지 전송" 버튼을 눌러 텔레그램 봇에게 메시지가 오는지 확인한다.





6. 고급 탭으로 이동 하여 SMS 에 관련한 항목을 모두 체크 한다.


가장 위에 있는 "ㅁSMS " 체크 박스를 체크 표시하면 모두 체크 된다.


위쪽에 있는 저장 버튼을 눌러 저장한다.



XPEnology 의 SMS 메시지를 텔레그램 봇으로 모두 받을 수 있게 되었다.

  1. 부탁드립니다 2019.04.25 23:58


    안녕하세요 좋은 글 감사합니다. 관련 글과는 상관없지만 텔레그램 관하여 질문드리고 싶어 댓글남깁니다 ㅠ


    제 문제상황은 2차비밀번호를 걸었는데 기억이 나지않아 초기화해야하는 상황이고 핸드폰을 바꾸어야하는데 원래폰 이외에는 2차비밀번호로 인해 로그인이 안되는 상황입니다.

    텔레그램 데이터와 대화방 모두 나가지않은 상태에서 새로운폰으로 옮길 수는 없는것이겠죠~?

    혹은 2차비밀번호 생성시 이메일을 기입하지않아 계정초기화를 요구하는 상황인데 찾을 방법은 없겠죠~?

    마지막으로 동일한번호로 계정추가를 하게되면 어떤일이 일어날까요~?

  2. BlogIcon Acidpop acidpop 2019.04.26 10:41 신고

    글쎄요.. 해당 내용은 텔레그램측에 문의를 해보시는게 좋을거 같네요

  3. 부탁드립니다 2019.04.27 13:37

    감사합니다

Telegram BOT 을 생성 하였다면 필요한 사용자에게 메시지를 보내야 한다.

 

Telegram BOT API 는 char_id 값 또는 채널 이름으로 메시지를 보낼수 있는데

 

이중 char_id 값을 가져 오는 방법을 설명 한다.

 

 

먼저 생성한 Bot 에게 아무 메시지나 전달 한다.

 

그 후 인터넷창에서 다음 URL 을 호출한다.

 

 

https://api.telegram.org/bot186547547:AAEXOA9ld1tlsJXvEVBt4MZYq3bHA1EsJow/getUpdates

 

빨간색 글씨 부분은 자신의 BOT 이 생성되면서 만들어진 Token 값이다.

 

자신의 Token 값으로 바꿔서 사용해야 한다.

 

 

{"ok":true,"result":[{"update_id":87654321,
"message":{"message_id":3,"from":{"id":12345678,"first_name":"\uc774\ucda9\ud638"....................

 

 

위와 같은 형식의 json 파일이 다운로드 된다.

 

그중 from 아래의 id 값이 바로 사용자의 chat_id 값이다.

 

 

  1. 2017.05.16 13:52

    비밀댓글입니다

  2. BlogIcon Danzy 2017.12.19 13:37

    https://github.com/A3sal0n/FalconGate/wiki/Get-Telegram-Chat-ID
    잘 안되어서 URL 방법을 찾았는데 같은 방법일까요?

    • BlogIcon Acidpop acidpop 2017.12.19 13:39 신고

      넵 동일합니다.
      해당 텔레그램 봇에게
      /get_my_id
      메시지를 보내면 id 를 보내 주네요

Telegram BOT 을 사용하기 위해 BOT 계정을 생성 하는 방법을 포스팅 한다.

 

 

 

1. Telegram 의 맨 왼쪽 상단에 @BotFather 를 검색 한다.

 

모바일용 Telegram은 다음 그림에 보이는것과 같이 새로운 메시지 버튼을 클릭 하고 @BotFather 를 검색한다.

 

 

2. @BotFather 를 검색 하면 그림과 같은 프로필 사진의 대화 상대를 찾을 수 있다.

 

BotFather 를 클릭하여 대화를 시작한다.

 

 

 

3. 시작 버튼 또는 /start 를 입력하여 메시지를 전달한다.

 

 

4. /start 메시지를 전달 하면 BotFather 는 위와 같은 메시지를 보내준다.

계정을 생성 하기 위해 /newbot 을 클릭하거나 /newbot 이라고 메시지를 보낸다.

 

 

 

 

5. /newbot 메시지를 보내면 BotFather 가 BOT 이름은 뭘로 할꺼냐고 묻는다.

 

맨 끝이 bot으로 끝나는 이름을 입력하면 된다.

 

예를 들어 acidpopnas  라고 메시지를 보내면 bot 으로 끝나는 이름으로 입력하라고 BotFather 가 말한다.

 

acidpopnasbot  이라고 메시지를 보내면 BOT 계정이 생성이 되었고 해당 봇의 Token 값이 보여진다. (이 스크린샷의 Token 은 이미 재발급 되어 없는 Token)

 

 

 

6. BOT 을 사용하기 위한 계정 생성이 완료 되었다.

 

여기에서 가장 중요한 부분은 Token 값이다.

 

 

Use this token to access the HTTP API:
186547547:AAEXOA9ld1tlsJXvEVBt4MZYq3bHA1EsJow 

 

이 값을 이용하여 Bot 을 만들거나 Bot 으로 메시지를 보낼 수 있다.

+ Recent posts