週記くらい

  • Profile

Monthly Archives: July 2011

Golangで、外部コマンド実行

Posted on 2011/07/10 by smeghead

前回Golangをバージョンアップした時動かなくなったexec周りのメモです。

Golangで何かをやろうとして、実装方法がわからない時、最初に当たるのは、公式のリファレンスです。

  • http://golang.org/pkg/exec/

これは結構しっかり書いてあるんですが、使用例が書いてないので、どう使うのが正しいのかわからない 時があります。検索しても、新しい言語であるせいか、あまりサンプルコードが見付からないです。 そんな時は、Golangのソースに添付されているテストコードと、実際のソースコードを見ることになります。

最初に実装した時(release.r57.1 8294)も、exec周りのソースコードを見て外部コマンド実行ができるように なったんですが、今回見たら(release.r58 8731)、悲しいくらいexec関連のインターフェースが変わっていたので、 新しいインターフェースでの外部コマンド実行のコードをメモしておきます。

main.go

package main
 
import (
        "os"
        "io"
        "log"
        "exec"
)
 
func RunCommand(command string, args []string, environ []string) {
        cmd := exec.Command(command)
        cmd.Env = environ
        cmd.Args = args
        cmd.Dir = "."
        stdout, err := cmd.StdoutPipe()
        if err != nil {
                log.Fatal("failed to retrieve pipe. %s", err)
                os.Exit(-1)
        }
 
        err = cmd.Start()
        if err != nil {
                log.Fatal("failed to execute external command. %s", err)
                os.Exit(-1)
        }
 
        WriteFileStream(stdout)
}
 
func WriteFileStream(reader io.Reader) {
        var (
                err os.Error
                n int
        )
        buf := make([]byte, 1024)
 
        for {
                if n, err = reader.Read(buf); err != nil {
                        break
                }
                log.Print(string(buf[0:n]))
        }
        if err == os.EOF {
                log.Println("stdout end");
                err = nil
        } else {
                log.Println("ERROR: " + err.String());
        }
}
 
func main() {
        environ := os.Environ()
        command := "/bin/ping"
        args := []string {command, "-c", "5", "localhost"}
        RunCommand(command, args, environ)
}

package main import ( "os" "io" "log" "exec" ) func RunCommand(command string, args []string, environ []string) { cmd := exec.Command(command) cmd.Env = environ cmd.Args = args cmd.Dir = "." stdout, err := cmd.StdoutPipe() if err != nil { log.Fatal("failed to retrieve pipe. %s", err) os.Exit(-1) } err = cmd.Start() if err != nil { log.Fatal("failed to execute external command. %s", err) os.Exit(-1) } WriteFileStream(stdout) } func WriteFileStream(reader io.Reader) { var ( err os.Error n int ) buf := make([]byte, 1024) for { if n, err = reader.Read(buf); err != nil { break } log.Print(string(buf[0:n])) } if err == os.EOF { log.Println("stdout end"); err = nil } else { log.Println("ERROR: " + err.String()); } } func main() { environ := os.Environ() command := "/bin/ping" args := []string {command, "-c", "5", "localhost"} RunCommand(command, args, environ) }

今回やりたかったのは、バックグラウンドで外部コマンドを実行しつつ、流れてくる 標準出力を取得することでした。cmd.StdoutPipe()で取得したio.Readerから、 WriteFileStreamで、標準出力を受けとり次第、ログ出力してます。 最初、buf変数を要素数を指定せずに定義してたところ、標準出力を取ろうとすると、すぐos.EOFが 返ってきて、取得できなかったのですが、makeで領域を確保する形で定義するように変更したところ、 正しく標準出力を取得できました。

Makefile

default: main.go
        6g main.go
        6l -o runcommand main.6
 
run: default
        ./runcommand

default: main.go 6g main.go 6l -o runcommand main.6 run: default ./runcommand

実行結果

$ ./runcommand 
2011/07/11 03:03:27 PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.048 ms
2011/07/11 03:03:28 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.042 ms
2011/07/11 03:03:29 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.041 ms
2011/07/11 03:03:30 64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.041 ms
2011/07/11 03:03:31 64 bytes from localhost (127.0.0.1): icmp_seq=5 ttl=64 time=0.042 ms
2011/07/11 03:03:31 
2011/07/11 03:03:31 --- localhost ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3996ms
rtt min/avg/max/mdev = 0.041/0.042/0.048/0.008 ms
2011/07/11 03:03:31 stdout end

$ ./runcommand 2011/07/11 03:03:27 PING localhost (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.048 ms 2011/07/11 03:03:28 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.042 ms 2011/07/11 03:03:29 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.041 ms 2011/07/11 03:03:30 64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.041 ms 2011/07/11 03:03:31 64 bytes from localhost (127.0.0.1): icmp_seq=5 ttl=64 time=0.042 ms 2011/07/11 03:03:31 2011/07/11 03:03:31 --- localhost ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 3996ms rtt min/avg/max/mdev = 0.041/0.042/0.048/0.008 ms 2011/07/11 03:03:31 stdout end

Posted in golang | Leave a comment |

Golang バージョンアップしてみた

Posted on 2011/07/08 by smeghead

最近、Golang を触ってます。

Golangの標準ライブラリのhttpサーバを使った時、ポート番号を1975にしたら、外部からの接続ができなくなっていた。 いろいろ検索してもあまり決定的な解決策が見つからなかったが、Golangのイシュートラッキングシステムで、最近関連部分を変更した記述を見つけて、少ない望みに掛けてgoを最新化してみた。

今まで使ってたバージョン

$ ./6g -V
6g version release.r57.1 8294

$ ./6g -V 6g version release.r57.1 8294

新しくインストールしたバージョン

$ ./6g -V
6g version release.r58 8731

$ ./6g -V 6g version release.r58 8731

数字を見るとあまり変わってないようですが、インストール後にコンパイルしてみると、いくつかのエラーが出た。

  • encoding/line が無くなっていた。
  • exec のUIが全く変わってしまっていた。 — この修正については、execの下をスクラッチで書き直したと言えるくらい変わってたので、驚いたけど、こうゆう変化に触れるのは、新しい言語の醍醐味かもしれない。

http://golang.org/pkg/exec/ ここを見ながら、なんとかコンパイルして動かしてみると、運良く外部から接続できるようには、なっていた。

でも、exec周りの修正の影響で、自分が作ってる機能が動かなくなってるようなので、原因を調べてる。。。 なんだか、肉を切らせて骨を断つ、なのか、その逆なのかわからないことになってる;;

大事なことを書くのを忘れてた

バージョンアップしたら、コンパイルが更に早くなった気がする。(それ程大きいものを作ってる訳じゃないけど)

Posted in golang | Leave a comment |
« Previous Page

Pages

  • Profile

Archives

  • March 2018
  • May 2015
  • February 2015
  • January 2015
  • December 2014
  • November 2014
  • October 2014
  • September 2014
  • April 2014
  • November 2013
  • October 2013
  • July 2013
  • April 2013
  • March 2013
  • February 2013
  • January 2013
  • December 2012
  • November 2012
  • October 2012
  • September 2012
  • August 2012
  • July 2012
  • June 2012
  • May 2012
  • April 2012
  • March 2012
  • February 2012
  • January 2012
  • December 2011
  • November 2011
  • October 2011
  • September 2011
  • August 2011
  • July 2011
  • June 2011
  • May 2011
  • April 2011
  • March 2011
  • February 2011
  • January 2011
  • December 2010
  • November 2010
  • October 2010
  • September 2010
  • August 2010
  • July 2010
  • June 2010
  • May 2010
  • April 2010
  • March 2010
  • February 2010
  • January 2010
  • December 2009
  • November 2009
  • October 2009
  • August 2009
  • July 2009
  • June 2009
  • May 2009
  • April 2009
  • March 2009
  • January 2009
  • December 2008
  • November 2008
  • October 2008
  • September 2008
  • August 2008
  • July 2008
  • June 2008
  • May 2008
  • April 2008
  • March 2008
  • February 2008
  • January 2008
  • December 2007
  • November 2007
  • October 2007
  • September 2007
  • August 2007
  • July 2007
  • June 2007
  • May 2007
  • April 2007
  • March 2007
  • February 2007
  • January 2007
  • December 2006
  • July 2006

Categories

  • android (35)
  • apache (1)
  • bison (1)
  • BTS (18)
  • c# (23)
  • cgi (1)
  • chrome (9)
  • chromeextention (18)
  • clclcl (9)
  • clojure (13)
  • cloudbug1 (2)
  • css (4)
  • cygwin (7)
  • C言語 (21)
  • dart (1)
  • dotnet (11)
    • vb.net (2)
  • e-hash.jp (1)
  • eclipse (2)
  • emacs (10)
  • excel (1)
  • flex (1)
  • framework (11)
  • free (92)
  • gae (4)
  • gcc (4)
  • gimmehash.in (1)
  • glipper (3)
  • golang (7)
  • howm (1)
  • html (3)
  • ikushipe (1)
  • java (47)
  • JavaScript (28)
  • linux (16)
  • lisp (92)
  • lua (34)
  • luatinycgi (2)
  • mba (1)
  • Meadow (4)
  • memo (1)
  • music (5)
  • mysql (1)
  • neta (5)
  • O/Rマッピングツール (4)
  • obj-c (6)
  • OOP (6)
  • oracle (1)
  • perl (48)
  • php (38)
    • CakePHP2 (2)
  • PostgreSQL (8)
  • PowerShell (1)
  • putty (1)
  • python (14)
  • redmine (2)
  • ruby (7)
  • s3 (1)
  • sakura (5)
  • screen (1)
  • Selenium (1)
  • SF (1)
  • SKK (4)
  • slime (6)
  • sql (8)
  • sqlite3 (4)
  • starbug1 (179)
  • tthttpd (3)
  • twitter (7)
  • ubuntu (14)
  • Uncategorized (4)
  • unix (14)
  • unkode-mania (5)
  • vba (3)
  • vim (24)
  • w3m (1)
  • Windows (16)
  • wordpress (1)
  • zsh (6)
  • 愚痴 (1)

WordPress

  • Log in
  • WordPress

Subscribe

  • Entries (RSS)
  • Comments (RSS)

Pages

  • Profile

Archives

  • March 2018
  • May 2015
  • February 2015
  • January 2015
  • December 2014
  • November 2014
  • October 2014
  • September 2014
  • April 2014
  • November 2013
  • October 2013
  • July 2013
  • April 2013
  • March 2013
  • February 2013
  • January 2013
  • December 2012
  • November 2012
  • October 2012
  • September 2012
  • August 2012
  • July 2012
  • June 2012
  • May 2012
  • April 2012
  • March 2012
  • February 2012
  • January 2012
  • December 2011
  • November 2011
  • October 2011
  • September 2011
  • August 2011
  • July 2011
  • June 2011
  • May 2011
  • April 2011
  • March 2011
  • February 2011
  • January 2011
  • December 2010
  • November 2010
  • October 2010
  • September 2010
  • August 2010
  • July 2010
  • June 2010
  • May 2010
  • April 2010
  • March 2010
  • February 2010
  • January 2010
  • December 2009
  • November 2009
  • October 2009
  • August 2009
  • July 2009
  • June 2009
  • May 2009
  • April 2009
  • March 2009
  • January 2009
  • December 2008
  • November 2008
  • October 2008
  • September 2008
  • August 2008
  • July 2008
  • June 2008
  • May 2008
  • April 2008
  • March 2008
  • February 2008
  • January 2008
  • December 2007
  • November 2007
  • October 2007
  • September 2007
  • August 2007
  • July 2007
  • June 2007
  • May 2007
  • April 2007
  • March 2007
  • February 2007
  • January 2007
  • December 2006
  • July 2006

Categories

  • android (35)
  • apache (1)
  • bison (1)
  • BTS (18)
  • c# (23)
  • cgi (1)
  • chrome (9)
  • chromeextention (18)
  • clclcl (9)
  • clojure (13)
  • cloudbug1 (2)
  • css (4)
  • cygwin (7)
  • C言語 (21)
  • dart (1)
  • dotnet (11)
    • vb.net (2)
  • e-hash.jp (1)
  • eclipse (2)
  • emacs (10)
  • excel (1)
  • flex (1)
  • framework (11)
  • free (92)
  • gae (4)
  • gcc (4)
  • gimmehash.in (1)
  • glipper (3)
  • golang (7)
  • howm (1)
  • html (3)
  • ikushipe (1)
  • java (47)
  • JavaScript (28)
  • linux (16)
  • lisp (92)
  • lua (34)
  • luatinycgi (2)
  • mba (1)
  • Meadow (4)
  • memo (1)
  • music (5)
  • mysql (1)
  • neta (5)
  • O/Rマッピングツール (4)
  • obj-c (6)
  • OOP (6)
  • oracle (1)
  • perl (48)
  • php (38)
    • CakePHP2 (2)
  • PostgreSQL (8)
  • PowerShell (1)
  • putty (1)
  • python (14)
  • redmine (2)
  • ruby (7)
  • s3 (1)
  • sakura (5)
  • screen (1)
  • Selenium (1)
  • SF (1)
  • SKK (4)
  • slime (6)
  • sql (8)
  • sqlite3 (4)
  • starbug1 (179)
  • tthttpd (3)
  • twitter (7)
  • ubuntu (14)
  • Uncategorized (4)
  • unix (14)
  • unkode-mania (5)
  • vba (3)
  • vim (24)
  • w3m (1)
  • Windows (16)
  • wordpress (1)
  • zsh (6)
  • 愚痴 (1)

WordPress

  • Log in
  • WordPress

CyberChimps WordPress Themes

© 週記くらい@やーづ

With Google+ plugin by Geoff Janes