monit helper for quota monitoring in go

I want to keep under control a system where each user has an amount of filesystem quota reserved; in particular I would like to get notified if and when a user exceeds some treshold. Since I already have Monit in place in the server, I took the chance to write a small Go utility in order to retrieve the quota percentage. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 // quotachecker.go package main import ( "os" "os/exec" "regexp" "strconv" "strings" ) func main() { //a fake implementation, just for testing purpose //cmd := exec.Command("/bin/sh", "-c", "cat fakequota.txt") cmd := exec.Command("/usr/bin/repquota", "-a") stdout, err := cmd.Output() if err != nil { panic(err.Error()) } re, err := regexp.Compile("^[[:alnum:]]+\\s+--\\s+\\d+\\s+\\d+") if err != nil { panic(err.Error()) } percent_max := 0 result := strings.Split(string(stdout), "\n") for _, line := range result { match := re.MatchString(line) if !match { continue } fields := strings.Fields(line) spaceused, err := strconv.ParseInt(fields[2], 10, 64) if err != nil { panic(err.Error()) } spacetotal, err := strconv.ParseInt(fields[4], 10, 64) if err != nil { panic(err.Error()) } if spacetotal == 0 { continue } //calculate max percent used percent := int(100 * spaceused / spacetotal) if percent > percent_max { percent_max = int(percent) } } os.Exit(percent_max) } This is also an example on how to run external programs in Go and filter the output using regular expressions. ...

March 30, 2016 · Andrea Manzini

simple and easy linux job queue

Recently I have been in a situation where I needed a simple ‘batch’ job scheduler, where I could submit some long-running tasks to a server and have a ‘system’ that serialize access the execution with some basic job control facilities (remove a job from the queue, stop the processing, and so on). Linux printing subsystem is already designed to do this, and we can exploit the CUPS printing subsystem to run our “batch” jobs. ...

December 21, 2015 · Andrea Manzini

redirect output of an already running process

Long story short: you have launched your script/program but forgot to redirect the output to a file for later inspection. #!/usr/bin/python3 #sample endless running program that prints to stdout import time,datetime while True: print(datetime.datetime.now().time()) time.sleep(1) Using GNU Debugger you can re-attach to the process, then invoke the creation of a logfile and duplicate the file descriptor to make the system send the data to the new file, instead of the terminal: ...

April 24, 2015 · Andrea Manzini

Sincronizzare una directory tra due server linux

Obiettivo vogliamo mantenere la stessa directory sincronizzata su due server linux. Questo significa che ogni aggiunta/rimozione/modifica di file in questa directory verrà automaticamente riportato sull’altro (salvo conflitti). Diamo per assunto che i due server siano raggiungibili via rete, ma per qualsiasi motivo non sia possibile collegare dello spazio disco condiviso. Implementazione Per raggiungere lo scopo, utilizzeremo il tool: csync2 su entrambi i server (che chiameremo nodo1 e nodo2), installiamo i pacchetti necessari: ...

March 20, 2015 · Andrea Manzini