내가 리눅스로 뭘 하고 있는지 로그 남기기 (파이썬)

지난번 포스팅에서 맥에서 내가 컴퓨터로 무엇을 하고 있는지 기록하는 스크립트를 어떻게 만들었는지에 대해 이야기했었다.

요번엔 리눅스다. 지난번 스크립트는 애플스크립트로 작성되어 맥에서만 동작했지만, 이번엔 리눅스에서 동작할 수 있도록 파이썬으로 작성할 것이다.

이 스크립트의 전체 소스코드는 여기서 받을 수 있다.

만들기

일단 현재 사용중인 윈도를 얻어야 한다. 나는 wnck 모듈을 사용했다. 그냥 쓰기 쉬워보여서.

import wnck

def get_current_window():
    try:
        return wnck.screen_get_default().get_active_window()
    except AttributeError:
        traceback.print_exc(file=sys.stderr)
        return False

이렇게 해서 얻은 윈도에서 프로세스 id를 얻은 다음, 다시 그 프로세스 id에서 프로세스 이름을 얻는다. 윈도 이름은 그냥 get_name() 메소드로 얻을 수 있다.

def log(output):
    // ...
    window = get_current_window()
    name = get_name(window.get_pid())
    window_name = window.get_name()
    // ...

def get_name(pid):
    return [ps.name for ps in psutil.get_process_list() if ps.pid == pid][0]

ip, ssid, 날짜도 얻는다. ip하고 ssid는 그냥 ip와 iwconfig를 직접 실행해서 얻었다.

def get_ip():
    #Use ip route list
    try:
        arg = 'ip route list'
        p = subprocess.Popen(arg, shell=True, stdout=subprocess.PIPE)
        data = p.communicate()
        sdata = data[0].split()
        ipaddr = sdata[ sdata.index('src')+1 ]
        return ipaddr
    except Exception, e:
        traceback.print_exc(file=sys.stderr)
        return '-'

def get_ssid():
    arg='iwconfig'
    p = subprocess.Popen(arg, shell=True, stdout=subprocess.PIPE, stderr=None)
    for line in p.communicate():
        if line:
            match = re.search('ESSID:"(.*)"', line)
            if match:
                return match.groups()[0]

    return '-'

def get_date():
    return time.strftime('%Y/%m/%d-%H:%M', time.localtime())

실제로 파일에 기록하는 역할을 하는 log() 함수도 만든다.

def log(output):
    try:
        window = get_current_window()
        if not window:
            sys.stderr.write('failed to get windown')
            return True

        format = 'a4'
        output.write("%s %s %s %s %s %sn" % (
            format, get_ip(), get_ssid(), get_date(),
            get_name(window.get_pid()), window.get_name()))
    except Exception, e:
        traceback.print_exc(file=sys.stderr)

    return True

마지막으로 60초에 한번씩 실행되도록 glib.timeout_add 로 설정해주고, gtk.main()을 호출하면 된다.

glib.timeout_add(60 * 1000, log, output) # 60sec
gtk.main()

문제와 해결방법

osx때는 없었던 문제가 두 가지 정도 있어서 애를 좀 먹었다.

gtk를 사용할 수 없는 환경에서는 실행 불가

이 때문에 osx때 했던 것 처럼 crontab에 넣는 방법은 사용할 수 없다. 그래서 대신 우분투 Startup Applications에 등록했다.

ssid를 알아내려면 루트 권한이 필요

리눅스에서는 iwconfig로 ssid를 알아내려면 루트 권한이 필요하다.

이 문제의 해결방법엔 두 가지가 있다.

단순한 방법: iwconfig가 파일 owner(즉 root)의 권한을 갖고 실행되도록 만들기

sudo chmod +s /sbin/iwconfig

조금 더 정교한 방법: iwconfig가 ssid를 알아낼 수 있도록 권한주기

sudo setcap cap_net_raw,cap_net_admin=eip /sbin/iwconfig

나는 후자를 택했다. 누가 실행하든 root 권한으로 실행된다는 건 좀 겁나니까.

이 해결방법에 더 자세히 알고 싶다면 내가 스택오버플로우에 올린 질문을 보라. TOC라는 분이 매우 친절하게 답변을 달아주었다.

이렇게 해서 나는 osx나 리눅스를 쓸 때 내가 컴퓨터로 무엇을 했는지에 대한 기록을 항상 남기고 있다. 나는 깨어있는 시간의 절반을 컴퓨터 앞에서 보내고 있으니 (( 이 사실 자체도 이 로그를 통해서 안 것이다. 내가 컴퓨터를 사용하는 시간은 하루 평균 8시간을 약간 넘는 정도다. )), 이는 결국 내 인생의 절반에 대한 로그를 남기고 있다는 것과 같다.

현재는 주로 ‘내가 그때 뭘 했더라’나 ‘그걸 하는데 시간을 얼마나 썼더라’를 확인해야 할 때 이용하고 있으며, 가끔씩 내가 컴퓨터로 뭘 주로 하는지 알아보고 싶을때도 사용한다.

추가

로그가 실제로 어떤식으로 남는지 궁금해하실 분들을 위해, 내가 이 글을 작성하는 동안 남은 로그를 올려본다.

a4 192.168.0.22 nori 2012/09/09-01:40 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:41 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:42 gnome-terminal worklog.py (~/mysrc/worklog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:43 chromium-browser Posts ‹ npcode — WordPress - Chromium
a4 192.168.0.22 nori 2012/09/09-01:44 gnome-terminal worklog-py.md (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:45 gnome-terminal worklog.py + (~/mysrc/worklog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:46 gnome-terminal worklog.py (~/mysrc/worklog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:47 chromium-browser wnck python - Google 검색 - Chromium
a4 192.168.0.22 nori 2012/09/09-01:48 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:49 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:50 gnome-terminal worklog-py.md (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:51 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:52 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:53 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:54 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:55 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:56 gnome-session-properties Edit Startup Program
a4 192.168.0.22 nori 2012/09/09-01:57 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:58 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-01:59 gnome-terminal iwconfig (~/wiki) - VIM
a4 192.168.0.22 nori 2012/09/09-02:00 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-02:01 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-02:02 gnome-terminal worklog-py.md (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-02:03 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-02:04 gnome-terminal worklog-py.md (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-02:05 gnome-terminal worklog-py.md (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-02:06 gnome-terminal linux (~/wiki) - VIM
a4 192.168.0.22 nori 2012/09/09-02:07 gnome-terminal worklog-py.md (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-02:08 gnome-terminal COMMIT_EDITMSG + (~/mysrc/worklog/.git) - VIM
a4 192.168.0.22 nori 2012/09/09-02:09 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-02:10 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-02:11 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-02:12 gnome-terminal worklog-py.md + (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-02:13 gnome-terminal worklog-py.md (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-02:14 gnome-terminal worklog-py.md (~/blog) - VIM
a4 192.168.0.22 nori 2012/09/09-02:15 chromium-browser npcode - Chromium
a4 192.168.0.22 nori 2012/09/09-02:16 gnome-terminal  ~/blog
a4 192.168.0.22 nori 2012/09/09-02:17 chromium-browser 새로운 글 추가 ‹ npcode — WordPress - Chromium
a4 192.168.0.22 nori 2012/09/09-02:18 chromium-browser npcode » 내가 리눅스로 뭘 하고 있는지 로그 남기기 (파이썬) - Chromium
a4 192.168.0.22 nori 2012/09/09-02:19 chromium-browser 글 편집 ‹ npcode — WordPress - Chromium
a4 192.168.0.22 nori 2012/09/09-02:20 chromium-browser 글 편집 ‹ npcode — WordPress - Chromium
Advertisements

내가 리눅스로 뭘 하고 있는지 로그 남기기 (파이썬)”에 대한 1개의 생각

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중