-

 

 


 

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 가 부팅시 시작 되는지 확인해 본다.

저작자 표시 비영리 변경 금지
신고

  • 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의 절대경로를 변경하여 해결하였습니다! 저보다 더 좋은 해결 방법을 알고 계시다면 댓글을 써주세요!

    1. BlogIcon Acidpop acidpop 2016.12.05 09:20 신고

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

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

    2. BlogIcon xoskd 2017.03.25 21:48 신고

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

  • 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: 명령을 허용하지 않음 이라고하네요

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

    1. BlogIcon Acidpop acidpop 2017.02.13 10:36 신고

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

  • 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 로 실행권한을 줘야하나요?

    1. BlogIcon Acidpop acidpop 2017.02.14 09:37 신고

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

  • BlogIcon xoskd 2017.03.25 22:16 신고

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

    1. BlogIcon Acidpop acidpop 2017.03.30 09:14 신고

      음...제가 어떻게 해야 할까요?

  • 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: 연결이 거부됨
    연결이 거부됫다고 뜨네여

    1. 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 로 만드신건 아니신지요

  • 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.
    실행시 이렇게 뜹니다
    파일다 제대로있고 경로도 같습니다

    1. BlogIcon xoskd 2017.04.10 23:11 신고

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

    2. BlogIcon xoskd 2017.04.10 23:15 신고

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

    3. 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 쓰지 않으시는걸 추천드려요

    4. 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"
      이줄을 추가시키면되나여??

    5. BlogIcon Acidpop acidpop 2017.04.10 23:54 신고

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

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

  • gawoon 2017.10.02 21:04 신고

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

다른 카테고리의 글 목록

강좌/RaspberryPI 활용 카테고리의 포스트 목록