지난번 포스팅에서 맥에서 내가 컴퓨터로 무엇을 하고 있는지 기록하는 스크립트를 어떻게 만들었는지에 대해 이야기했었다.
요번엔 리눅스다. 지난번 스크립트는 애플스크립트로 작성되어 맥에서만 동작했지만, 이번엔 리눅스에서 동작할 수 있도록 파이썬으로 작성할 것이다.
이 스크립트의 전체 소스코드는 여기서 받을 수 있다.
만들기
일단 현재 사용중인 윈도를 얻어야 한다. 나는 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
“내가 리눅스로 뭘 하고 있는지 로그 남기기 (파이썬)”에 대한 1개의 생각