2011年11月17日 星期四

系統備份 script

紀錄一下半年前的筆記(快沒時間了...Orz)。

之前備份策略是每個禮拜將 /home , /etc , /var 備份到另一顆硬碟上,過兩個禮拜再存到外接硬碟,但有時候會忘記整理,就會碰到備份檔把整顆硬碟空間吃光的情形;現在改成先檢查硬碟空間再備份,如果空間不夠會在 terminal 上顯示訊息,等待十分鐘後再次檢查硬碟空間,如果要在 cron job 啟動 GUI 程式,只要在 cmd 前面加上 export DISPLAY=:0 就行了。

原本想說用 `wall` 或 `talk` 來送訊息,卻發現 rxvt-unicode 收不到廣播訊息,不信邪想翻翻 `walk` 的原始碼看看到底是怎麼寫的,結果發現原始碼內的輸出訊息不大一樣,才發現 Arch Linux 是用 sysinitv 裡面的 `wall` 而不是 util-linux 內的 `wall`,也因此發現有 pkgtools 這個好用的 package,只要下 pkgfile -s CMD 就可以知道是哪個 package 提供的程式。

看了 sysinitv 內的 dowall.c 發現是用 getutent() 來抓目前登入的使用者,但是抓不到 rxvt-unicode 登入的紀錄,還有 xterm +ut 也是抓不到,後來乾脆就直接去掃 /dev/pts/ ,用檔案擁有者來判斷登入者,也很方便, getutent() 測試原始碼如下,編譯完成後只要執行就會列出有抓到登入的使用者。

#include <sys/types.h>
#include <stdio.h>
#include <utmp.h>
#include <unistd.h>

int main(){

int type ,pid;
char *tty,*id, *user, *host;
struct utmp *utmp;
while ((utmp = getutent()) != NULL) {
type = utmp->ut_type;
pid = utmp->ut_pid;
tty = utmp->ut_line;
id = utmp->ut_id;
user = utmp->ut_user;
host = utmp->ut_host;

printf("%d - %d - %s - %s - %s - %s\n",type , pid, tty, id, user, host);
}
}


因為 dcron 有類似 anacron 的功能,所以只要把 script 丟進 /etc/cron.weekly 就會自動執行,這次還用到 logging 這個 module ,非常方便,有了這個 module 就不必自己辛苦刻 log 了 :)


Reference: