New to Busy?

[야매코딩] 누구나 만들어보는 스팀봇! - (6) nohup으로 자동화, 알아서 언제나 24/7

47 comments

hellocrypto
55
last yearBusy5 min read

0. 프린이 여러분, 수고했어요. 마지막입니다.

코딩 1도 몰라도 일단 따라하면 되는, '누구나' 하는 야매코딩 시리즈입니다.

누구나 만들어보는 스팀봇! 강좌 마지막 편에 오신 것을 환영합니다.

저번 편에서 꽤 많은 내용을 다뤘습니다.

스팀 블록체인에서 받아오는 permlink 개념을 알아봤고, .export()를 이용해 포스트의 정보를 읽어보기도 했습니다. 에러를 해결하기 위해 노드도 변경하고 while문과 try/except문을 조합하기도 했죠.

뿐만 아니라 특정문구가 언급됐는지 실시간으로 체크가 가능해졌고, 포스팅 키를 넣어 대댓글도 달 수 있게 되었습니다.

즉 기본적인 기능을 갖춘 스팀봇이 드디어 완성됐었죠!

하지만 아직 원하는 문구를 인식하고, 실시간으로 지정된 문장으로 대댓글을 다는 정도입니다. 더 강려크한 기능을 갖췄으면 좋을텐데 말이죠! 그래서 추가 편성으로 심화편에서 보다 다양한 기능들을 3~4개 정도 소개하겠습니다.

자 이번 편에서는 VM인스턴스 화면을 닫아도 프린이만의 스팀봇이 24/7 작동하도록 하는 방법을 배워볼게요 :)

A. 개발 환경설정 따라하기 I - Google Cloud 세팅
B. 개발 환경설정 따라하기 II - Conda 세팅
C. 스팀 API 설치 및 살펴보기 101
D. 스팀 API 심화, 블록체인 & 포스트
E. 예제로 따라하는 스팀봇 뚝딱
F. nohup으로 자동화, 알아서 언제나 24/7

그럼 본격적으로 시작해볼까요?

  • 난이도: 中
  • 소요시간: 약 10분

이미지 출처 - https://dribbble.com/shots/3974885-Bumblebee by Pat Grivet

1. 한 가지 팁을 드릴게요.

여기까지 함께한 프린이라면 이제 강좌를 위한 준비 단계는 거뜬히 혼자 할 수 있다고 믿어요. VM인스턴스(부엌) 접속하고 조리기구 세팅까지 해주세요.

  1. 구글 클라우드 콘솔 사이트로 이동하고,
  2. Compute Engine 항목을 클릭하여,
  3. VM인스턴스의 SSH 버튼을 눌러 접속해주세요.
  4. 그리고 source activate steembot을 입력해주세요. (조리기구 세팅)

자 준비됐나요?

응? 어디서 읽어본듯한 데자뷰...라고요? 아닙니다!!

저번가지 완성했던 레시피(코드) 부터 다시 볼까요?

from steem.blockchain import Blockchain
from steem.post import Post
from steem import Steem
s = Steem(nodes=["https://rpc.buildteam.io"], keys=["Key Goes Here!"])
b = Blockchain(s)
while True:
    try:
        stream = map(Post, b.stream(filter_by=['comment']))
        for post in stream:
            if "@야매코딩" in post.export()['body']:
                print(post.export()['body'])
                post.reply("Hi there!","","hellocrypto")
    except:
        print("뀨")

그러고 보니 위에 레시피(코드)에서 한 가지 문제점이 있었죠?

분명 stream = map(Post, b.stream(filter_by=['comment']))에서 filter_by=['comment']의 역할이 실시간으로 읽어오는 블록체인 정보중에서 댓글만 필터해야 하는데, 포스트랑 댓글 둘 다 인식하고 있죠.

아무래도 댓글만 인식했으면 좋겠으니, 이걸 간단히 고쳐볼까요?

사실 저번 편에서 언급했어야 하는 내용인데 잊고 말았습니다 (데헷) 친절히 지적해주신 마아냐 @maanya님 감사합니다 :)

딱 한 줄만 추가하면 됩니다 :) if post.is_comment():

if "@야매코딩" in post.export()['body']:
      if post.is_comment():
            print(post.export()['body'])
            post.reply("Hi there!","","hellocrypto")

그럼 이제 레시피(코드) 로직이,

  1. 블록체인에서 실시간으로 정보 받아오다가
  2. "@야매코딩"이 들어가 있고
  3. 해당 정보가 포스트가 아닌 댓글이라면
  4. 해당 내용을 인쇄해주고, 댓글을 단다!

가 되겠네요. 포스트라면 무시를 하겠죠 이제.

그리고 if문 끝에 (:) 콜론이 있으니 기존 코드 두 줄은 한 번 탭을 해서 안으로 밀어주는거 잊지 말고요! 파이썬은 띄어쓰기에 민감합니다.

(한 번 더 탭!)print(post.export()['body'])
(한 번 더 탭!)post.reply("Hi there!","","hellocrypto")

만약 반대로 댓글이 아닌 포스트만 인식하고 싶다면 if post.is_main_post():를 사용하시면 됩니다.

2. 영.원.히. 일해라 스팀봇!

지금까지 스팀봇을 작동시키려면 python3 blockpost.py를 이용하고 있었죠?

하지만 이제 잘 알다시피 VM인스턴스 검은화면을 닫으면 종료되어 버린다는 단점을 갖고 있습니다. 스팀봇을 24/7 작동해야 의미가 있는데 말이죠.

그래서 해결책으로 리눅스의 nohup이라는 명령어를 사용해볼까 해요.

nohup python3 blockpost.py &

본래의 python3 blockpost.py 앞에 nohup 그리고 뒤에는 &가 추가됐죠?

VM인스턴스를 SSH키를 이용해 접속하면 검은화면이 떴었는데, 이를 닫는다는 것은 접속, 즉 연결을 끊다는 뜻이죠. 그래서 기존 실행되던 스팀봇도 멈췄고요.

그런데 nohup'연결이 끊겨도 상관없이~'라는 뜻을 가져요.

그리고 &백그라운드에서 실행시켜! 라는 뜻을 가지죠.

백그라운드(background)에서 실행시키는게 무슨 차이가 있냐고요? python3 blockpost.py를 실행하면 검은화면에서는 스팀봇이 돌아가면서 나오는 결과들만 계속 나왔죠. 다른 일을 할 수가 없었어요! 그런데 백그라운드로 보내면 뒷쪽에서 해당 일이 진행되고, 그동안 프린이 또 다른 작업을 할 수 있죠.

nohup python3 blockpost.py &을 입력하고 엔터를 누르셨나요? 그럼 아래와 같은 결과가 나와요.

리눅스에서 자동으로 해당 일(프로세스)에 번호를 매깁니다. 저 같은 경우에는 9886이라고 지정됐네요.

그리고 두 번째 사진을 보면 해당 결과는 nohup.out이라는 파일에 저장된다고 나옵니다.

결과가 파일에 저장되야 하는 이유요? 이제는 백그라운드에서 스팀봇이 돌아가니까, 에러 메세지나 성공했을 때 출력하던 댓글의 내용 등을 바로바로 검은 화면에서 못 보잖아요.

그래서 해당 내용을 파일에 저장해두면, 언제든 다시 돌아와서 확인할 수 있죠. 다른 말로는 로그(log)를 남긴다고 하죠.

이제 뒷쪽에서 잘 돌아가고 있는지 아닌지, 알 수가 없으니 확인해봐야겠죠?

ps라는 명령어를 쓰면 됩니다. 입력 후 엔터를 눌러주세요 그럼 아래와 같은 결과가 보입니다 :)

중간에 python3가 보이죠? 번호는 9886이네요.

아까 nohup으로 실행시킬 때 보였던 번호죠.

다행히 잘 실행되고 있네요 :)

이번에는 ls 명령어로 저장된 파일들 목록을 살펴볼까요?

이제 nohup.out이 추가됐네요! 이제 언제든지 cat nohup.out으로 안의 내용을 조회해볼 수 있습니다.

마지막으로 백그라운드에서 돌아가는 스팀봇을 중지시키고 싶을 때 방법을 알려드리겠습니다.

여러 방법들이 있겠지만, 저는 개인적으로 kill이라는 살벌한 명령어를 사용합니다.

아까 프로세스 번호를 뒤에 입력하면 되죠.

짜잔! terminated 즉 종료됐다고 나옵니다.

이제 방법을 잘 아시겠죠? nohup을 이용하시면 바로 검은화면을 닫아 VM인스턴스 접속을 끊어도 스팀봇은 열심히 24/7 일하고 있을겁니다.

3. 마무리.

길면 길고, 짧다면 짧은 야매코딩 여정이었습니다.

A. 개발 환경설정 따라하기 I - Google Cloud 세팅
B. 개발 환경설정 따라하기 II - Conda 세팅
C. 스팀 API 설치 및 살펴보기 101
D. 스팀 API 심화, 블록체인 & 포스트
E. 예제로 따라하는 스팀봇 뚝딱
F. nohup으로 자동화, 알아서 언제나 24/7

많은 프린이 여러분(그리고 뜻밖의 굇수분들)이 함께 해주셔서 힘이 났습니다. 덕분에 여기까지 약 9일만에 달려왔네요 :)

아무것도 몰랐던 프린이라도, 일단 기본적인 형태의 스팀봇을 직접 만들어 보는 경험을 함께 하고 싶었습니다. 꼭 코딩을 잘해야 누릴 수 있는게 아니라고 보여주고 싶었죠.

그 의지가 잘 전달됐을지 궁금하네요 하핳.

여기까지 야매코딩 시리즈의 '누구나 만들어보는 스팀봇!' 편이었습니다.

조금 충전의 시간을 가지고, 새로운 야매코딩 강좌로 찾아뵙겠습니다!

이만 상병 크립토 @hellocrypto였습니다. 필승!

Comments

Sort byBest