home 디렉토리 자동 백업 완성.

얼마전, 소를 잃을 뻔 한 적이 있다. 다행히도 케이블 하나 바꿔줌으로 사고는 수습됐는데..
별 건 없지만, 그래도 없어져버리면 아쉬운 법. 하여 미리 미리 사고에 대비한 보험을 들기로 했다.

시작 전에 조금 다른 얘길 해볼까.
친구가 일하는 곳에서 PC 가 필요하다 하여, 몇십년(?)동안 이용해오고 있는 용산 업체에서 적당하게 하나 골라준 적이 있다. HDD 를 넣을까말까 하다가, 쓰는 용량이 한정되어 있다기에 그냥 넘겨버렸었는데, 업무에 필요한 소프트웨어를 설치해주러 온 업자가 HDD 는 꼭 필요하다며 자신들에게서 구매하기를 권했다고 한다.

그들의 주장은 이랬다. SSD 는 언제 어떻게 고장이 날지 모른다는. (그럼 HDD 는 안 고장 나냐?)
틀린 말이라고 할 순 없지만, 그렇다고 HDD 를 구매하라는데 설득력이 더해지지도 않는다.
어차피 데이터는 SSD 이건, HDD 이건 한군데에만 저장이 되도록 설정되어 있으니까 말이다.

이왕 HDD 를 장착한다면, 양쪽 모두에 저장되도록 해놨어야 할텐데, 그런 일까진 하지 않은 듯. (내가 눈으로 확인하진 않았으니 알 수야 없지만.)


자세한 스크립트까지 올리진 않겠고, 대강 그림만 정리해본다.

  • ~ 산하 몇몇 디렉토리만 선택하여 nfs 로 마운트된 서버로 복사한다.
  • nfs 서버는 꺼져있을 때도 있으므로, 켜져있는지 확인한다.
  • 복사는 rsync 를 사용했고, 디렉토리 선택은 rsync 의 filter rule 의 힘을 빌렸다.
  • cron(정확히는 anacron) Daily 작업에 추가해서 매일 실행될 수 있도록 했다.
  • 작업내용을 log 로 저장하게끔 했고, 이 로그를 통해 cron 작업 시 무조건 실행되지 않고, 마지막 실행 후 최소 18시간이 지난 후 작동되도록 했다.
  • 그냥 부지불식간에 뒤에서 은밀히 실행되게 하기 보다는, 작업이 실행될 때 알림(Notification)을 사용하도록 했다. 이를 위해 kdialog 가 필요했다.

여기서 첫번째 관문은 디렉토리 선택이었다. 아니, ‘디렉토리 선택’이라기 보다는, 내가 선택한 디렉토리를 rsync 가 인식하도록 하는데 문제가 있었다고 해야 정확하겠다.
다른 글들에도 있지만, 이 방법을 알아내기까지 무수한 꽃삽질을 해댔었다. 어쨌든 답은 모두 구글질을 통해 얻어낼 순 있었는데..
man page 에 써 있는 내용을 읽고 바로 이해할 능력이 된다면 전혀 문제가 없겠지만, 그렇지 못하다는데서부터 문제는 시작됐다.
헌데, 이건 영어와 일정(그것도 꽤 먼)거리를 유지하고 사는 나에게만 해당하는 문제일거라 생각했는데, 그렇지가 않은가보다. StackExchange 등에서 본 봐에 의하면, 영어권에서도 난해하게 생각하긴 마찬가지인 듯.

언젠가, 어디선가 본 내용이 문득 스치고 지나간다.
오픈소스에서, 어찌보면 가장 크고 중요한 문제가 바로 ‘문서화’라고. 단순히 man page 수준이 아니라, 좀 더 실용할 수 있는 예제가 풍부한 설명서가 필요하다. 당장 구글에서 검색만 해도, ‘xxx examples’ 라는 표현이 자동으로 튀어나올 때가 많다. xxx 는 rsync 일 수도, mysql 일 수도, 기타등등 사람들 입에 오르내리는 그 어떤 프로그램에도 끼워넣을 수 있는데.

아무튼, 누군가 이런 프로젝트를 좀 더 거창하게 시작하지 않으려나. 물론 지금도 찾으면 없지는 않지만, 아직도 가려운 데는 많으나, 적절하게 긁을 도구(아아 효자손!)가 없는 경우가 훨씬 많다.

아무튼, rsync 에서 원하는 디렉토리를 적절하게 선택하기까지, include/exclude 의 산을 넘고, filter 라는 조수간만(潮水干滿)이 주는 고저차를 극복하기까지, 꽤 상당한 시간이 걸렸다.
그런데, 내용을 다 이해하고 man page 를 찬찬히 살펴보니… 이런, 그게 다 써있긴 했다. 내가 찾던 모든 내용이.

다만, 알고 보느냐와 모르고 보느냐의 차이가, 이해와 몰이해를 수직절단했으리라. (뭔 말이니..?)


다음 nfs 문제는 이전에 다른 스크립트에서 사용한 적이 있으므로 그걸 그대로 갖다 썼다. 헌데, 그 시스템은 수동 mount 를 해야했고, 이 시스템은 현재 autofs 를 쓰고 있으므로 굳이 그렇게 복잡하게 할 필요는 없었다. 먼저 ping 으로 켜져있는지 확인한 후, 켜져있으면 그냥 bash if directory exists 문법을 썼으면 됐다.
나중에 고쳐보기로. (언제??)


작업은 cron, 더 정확히는 사용자 권한으로 돌아가는 anacron 에게 맡겼다. Daily 로, 즉 하루에 한번 실행하게 했는데, Anacron 의 특성상, 하루에 한번은 반드시 24시간 간격을 의미하지는 않게 돼 있다.
예를 들어, 6월 23일은 하루 종일 PC 를 켜지 않다가 밤 10:30 경 컴퓨터를 켜서 Anacron Daily 가 그 무렵 실행됐다. 그러다가 24일이 됐고, Anacron 은 하루가 지났으므로(23일에서 24일로), 다시 Daily 를 실행하려고 시도한다.

이런 상태라면, 불과 몇시간만에 같은 작업이 반복될 가능성이 생긴다. 뭐, 이래도 관계는 없지만, 뭔가 좀 멋(무슨..?)을 내고자 시간 간격을 두기로 했다. 즉, 지난 번 저장 후 18시간이 지나지 않았다면 작업을 수행하지 않게끔.

이를 위해선 저장/복사 작업에서 로그를 기록하고, 최종 작업 시간을 저장해둬야만 한다.
하여, 로그가 기록될 디렉토리를 지정한 뒤, date 명령을 사용해서 epoch 형식으로 저장 시간을 기록하기로 했다.
스크립트가 시작하면, 로그 파일을 읽고 마지막 작업 시간을 알아낸 뒤, 현재 시간과 비교하여 18시간을 초과했을 경우만 작업이 이어지도록 했다. 여기엔 쓰인 잔머리는 date 와, 아주 약간 bash script 손기술(?)이 쓰였을 뿐이다.


이러면 모든 작업은 끝인데, 마지막으로 더 멋을 부려, 실행됨을 알려주게끔 했다.
만약 저장할 내용이 꽤 많다면, CPU 소모량도 커지게 되어, 현재 작업에 지장이 있을 수도 있다. 따라서 저장이 되고 있음을 알려주는게 좋으리란 생각이 들었다.

예전 Gnome 을 쓸 땐 zenity 로 이 작업을 수행했었는데, KDE 로 오고나선 kdialog 의 힘을 빌리게 됐다.

먼저 Notification 은 이런 형식을 사용한다. (여기에 문제가 있다. 이 글 맨 아래에 정리했다.)

kdialog --title "Backup!!" --passivepopup \
"Home 디렉토리 저장이 시작됩니다." 30

마지막 30 은 시간(초 단위)이다. 30초간 떠 있다가 사라진다.

또, 작업이 끝난 후에는 작업한 내용을 텍스트상자로 알려주게끔 했다.

echo  "$RESULTS" | kdialog --textbox - --title "저장 요약" 800 600

kdialog 설명서에는 나와있지 않은 내용인데, kdialog 도 Std. Input 을 지원한다. 따라서 위와같이 echo 의 결과를 Std. Input 으로 받아서 출력해줄 수 있다. 많은 리눅스 Command 명령어에서 - 는 Std. Input 을 받아들이라는 의미가 된다.


수동으로 실행해봤을 때는 문제가 없었다. 어딘가에서 이상한 상황이 되어 오작동이 날 수는 있겠지만, 그건 그때 해결하면 되고.
이제 막 만든 참이라 아직 anacron 에 의해 자동 실행은 되지 않았다.
과연, 그것까지 잘 될런지? 그렇다면 더 이상 소를 잃는 일은 없을텐데 말이지.


** anacron 실행 이후.

스크립트는 잘 작동한다. 아직까진 별다른 문제점을 찾지 못했다.
헌데, kdialog 는 작동하지 않는다. 흠.. 혹시 run level 때문일까? 하고 살짝 뒤져봤으나..

그게 아니고 아마도 DISPLAY 환경변수가 누락되어 나타나는 현상으로 보인다.
수정은 했는데.. 과연 내가 짚은 게 맞을지? 시간이 지나야 답을 알 수 있으니!!


답은 나왔다. DISPLAY 환경 변수 문제인데.. export 를 넣거나, 한 줄에 바로 넣어주면 되긴 한다.
예를 들면 이런 식으로.

export DISPLAY=:0
kdialog --title "Backup!!" --passivepopup "Home 디렉토리 저장이 시작됩니다." 30
echo  "$RESULTS" | kdialog --textbox - --title "저장 요약" 800 600

#또는,
DISPLAY=:0 kdialog --title "Backup!!" --passivepopup "Home 디렉토리 저장이 시작됩니다." 30
DISPLAY=:0 echo  "$RESULTS" | kdialog --textbox - --title "저장 요약" 800 600

kdialog –textbox 는 아무런 문제가 없다.
헌데, kdialog –passivepopup 은 조금 이상하게 작동한다. (좌상귀)

이런 식으로.

제대로 나오려면 이렇게 나와야 한다. (우상귀)

이것도 역시 환경변수 문제일 듯 한데…??


몇가지 경우로 시험해본 결과, 다음 조합/설정으로 제대로 뜨게 할 수 있었다.

export DISPLAY=:0 XDG_RUNTIME_DIR=/run/user/1000

어떻게 찾아냈느냐하면..
터미널을 열고, export 로 모든 환경변수를 출력한다.
그중에서 X 와 관련이 있을 법한 변수를 긁어모은 후, 몇몇을 대입/삭제해가면서 제대로 표시되는지를 찾았다. 마치 예전에 MS 윈도우에 들어있던 지뢰찾기 게임과 동일한 방식을 사용했다고 할 수 있겠다.
아무튼, 재수가 좋아서 한 5번 정도만에 성공할 수 있었다!

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.