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

in #kr-dev7 years ago

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였습니다. 필승!

Sort:  

강좌 잘 배웠습니다. !!!!
한가지 질문 있습니다.
조건 만족시 송금을 하고 싶습니다.
s.commit.transfer('hellocrypto', 1, 'SBD', 'hi', 'dailypro')
송금이 나가질 않습니다 .. 어찌해야 할까요????

송금은 액티브키를 사용하셔야합니다.

s.commit.transfer('hellocrypto', 1, 'SBD', 'hi', 'dailypro') 이부분이 맞나요?
2.jpeg

송금이 안나갑니다. ㅠㅠ
액티브키 사용했습니다.

gif 오픈소스 보다가 보니 아래 문장을 넣던데요 / 혹시나 넣었으나
from account import Account
위 문장을 넣으면 모듈이 없다고 작동을 안하던데요.. 혹시 이게 문제인가요?

accountfrom steem.account import Account 라고 쓰셔야해요 ;ㅂ;
아래의 코드가 정상 작동하는 것을 확인하였습니다.
parameter의 name 없이 입력하셨던게 문제가 된게 아닌가 싶습니다.

from steem import Steem
s = Steem(nodes=['https://rpc.buildteam.io'], keys=['액티브키'])
s.commit.transfer(to='dailypro', amount=0.001, asset='SBD', account='maanyabot')

속이다 후련합니다. 감사합니다.
하고자 했던걸 완료했습니다. 진짜로 감사드립니다. 4.jpeg

다행입니다 :D ㅎㅎㅎ 크립토님의 포스트인데 제가 대신 대답드려서 질투하실지도 모르겠군요 (...)

밤 사이에 잘 해결됐군요..! 질투라니 오히려 감사합니다 :)ㅋㅋ 일일 조교님(?) 감사 보팅이라도 여기 (주섬주섬)

와! 시급! /행복

풀봇ㅋㅋ 좋아요 핸폰으로 되요? 노트북으로 되요?
중고컴이라도 사야하나요?

아무래도 원격접속으로 하는 코딩이다보니, 성능은 상관없지만 컴퓨터(노트북) 환경이 따라하기 편할것 같네요 :)

딱 기초과정 마스터 해냈네요!
기념삼아 테스트 해보겠습니다.
@야매코딩

오오 퍼펙트! 야매봇 제작 성공 축하드려요ㅎㅎ

감싸합니다 싸부! 이제 새로운걸 배우러 돌아오기 전까진 하산해서 혼자서 수련해야겠네요!

좋은 강좌 하고 계시네요~~ 개발자들이 이런거 쓰는거 상당히 귀찮아하는데

대단하십니다!! 근데 언제 상병 크립토가 되신거죠? ㅎㅎ 축하드립니다~

몸 건강하세요!!

저는 야매개발자라 이런 글쓰는게 오히려 재밌나봅니다ㅎㅎ :) 상병 단지 몇 일 안 됐습니다 하핳 감사합니다 초이님!

주말 동안에 게을러서 숙제를 못따라 갔네요 ㅠㅠ 좋은 포스팅 연재하시느라 고생 많으셨어요! 푹 충전하시고 얼른 돌아오시기를 기다리고 있겠습니다아 :)

넵 금방 돌아올거니 그동안 한 번 스팀봇 완성까지 도전해보세요ㅎㅎ 덕분에 힘이 납니다!! 감사합니다아 :)

오! 저 문장으로 해결하셨군요.

전 포스트랑 댓글을 구분한다면 포스트는 title정보가 들어 있고 댓글을 title 정보가 없으니깐 title이 비였는지를 if문으로 필터링하면 되지 않을까 생각만 했었네요.

title로도 포스트랑 댓글을 구분할 수 있을 것 같아요. ^^

오 그러네요 :) 댓글은 따로 title이 없으니 이런 방법도 있네요! 주사위 봇 처럼 대량(?)의 호출이 있는 경우에 특히 유용하겠네요 매번 댓글 체크용 API 호출할 필요 없으니

어디 강의에 써도 될 정도로 인 것 같습니다!ㅎ

핳핳 감사합니다 COSINT님 :) (으쓱으쓱)

야매코딩 시리즈라~ 1편 부터 봐야겠는데요? 정말 저같은 쌩초보도 할 수 있단 말입니꽈~~ 설렘 설렘..

그렇습니돠! 막히는 부분 있으면 @hellocrypto 소환하는 댓글 남겨주세요! :)

저는 잘몰라서 ㅎㅎㅎ 크립토님 즐거운 주말저녁되세요^^

우부님도 좋은 주말 되세요 :)

이런 식으로 24시간동안 컴퓨터를 꺼도 실행되는 간단한 프로그램을 만들 수 있군요. 윈도우 업데이트가 테러할 염려없이! ㅎㅎㅎ 잘 배우고 갑니다 :)

윈도우 업데이트 때문에 멈추면 ㅂㄷㅂㄷ하죠 :) 넵 굇수 마아냐님께 조금이나마 팁이 됐다면 좋겠네요ㅎㅎ

Why don't you post in English have seen some of your English comments they are nice or do you know any suitable translator I could use to interact with you on steemit

Hi there. I will be posting in English as well soon. It's just that my starting point was with KR community. Thanks for your compliments :)

Wow thanks am happy I feel i will learn a lot from you, already added you to my ginabot notifications so I will be alerted anytime you post.

I will be waiting, Good night from my side