rorono
5/22/2016 - 6:14 AM

Example of connect with unix domain socket from https://github.com/kaneshin/playground/blob/master/go/unixsocket/main.go

Example of connect with unix domain socket from https://github.com/kaneshin/playground/blob/master/go/unixsocket/main.go

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net"
	"net/http"
	"os"
	"os/signal"
	"syscall"
)

const (
	sock = "/var/run/golang/gopher/go.sock"
)

func main() {
	mux := http.NewServeMux()

	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "<h1>It works!</h1>\n")
	})

	mux.HandleFunc("/header", func(w http.ResponseWriter, r *http.Request) {
		b, err := json.MarshalIndent(r.Header, "", "  ")
		if err != nil {
			fmt.Fprintf(w, err.Error())
		} else {
			w.Header().Add("Content-Type", "application/json")
			fmt.Fprintf(w, "%v\n", string(b))
		}
	})

	listener, err := net.Listen("unix", sock)
	if err != nil {
		fmt.Fprintln(os.Stderr, err.Error())
		os.Exit(1)
	}
	defer func() {
		if err := listener.Close(); err != nil {
			log.Println("Error:", err.Error())
		}
	}()
	shutdown(listener)
	if err := http.Serve(listener, mux); err != nil {
		fmt.Fprintln(os.Stderr, err.Error())
		os.Exit(1)
	}
}

func shutdown(listener net.Listener) {
	c := make(chan os.Signal, 2)
	signal.Notify(c, os.Interrupt, syscall.SIGTERM)
	go func() {
		s := <-c
		log.Println("Got signal:", s)
		if err := listener.Close(); err != nil {
			log.Println("Error:", err.Error())
		}
		os.Exit(1)
	}()
}

Install

このスクリプトを実行する前に、次のスクリプトを実行します

#!/bin/bash

gid_name=`id | awk '{print $2}' | sed -e 's/gid=[^(]*(*\(.*\))/\1/'`
sudo mkdir /var/run/golang && \
sudo chmod 774 /var/run/golang && \
sudo chgrp $gid_name