システム管理者のために行きます。 実用的な例。 パート0

こんにちは、私の名前はVitaliyであり、私は猿の開業医です-私にとっては、抽象的なマニュアルを100回読むよりも、一度見て、コピーする方が良いです。 長い間、私は通常のシステム管理者でした-CMD / BAT、さらにsh(Windowsのbusyboxを使用)でスクリプトを書きました。 しかし、通常のシェルを見逃し始めたため、自分用のRPCサーバーを作成することにしましたが、最小限のシステムコンポーネントで動作し、理解しやすく、マルチスレッド化され、最小限のコード行が含まれていました。 Javaとその他のOOPは却下しました。専門家にとっては抽象的すぎるため、実行する環境をターゲットコンピューターに配置する必要があり、管理者として更新する必要があるためです。 私は長い間perlを見てきましたが、動的な型付けが怖いです。 この記事では、プログラミングの初心者がGoを使用してシステム管理の問題を解決する方法を説明します。



「クイックスタート-Windowsでプログラム可能-環境の設定」を習得し、簡単なスクリプトを記述した経験があることを前提としています。 そして私は嘘をついた。 ターゲットマシンには、 Microsoft Visual C ++が必要な場合があります



最初に、単純なスクリプトをGoアプリに変換しようとします。 たとえば、 test.batを使用します。



@echo off set URL1="ftp://user:pass@88.88.88.88/test.zip" set URL2="ftp://user1:pass1@99.99.99.99/exchange/test.zip" set SAVE_PATH=".\test\test.zip" echo   curl %URL1% -o %SAVE_PATH% if %errorlevel% NEQ 0 ( echo       : %errorlevel% curl %URL2% -o %SAVE_PATH% )
      
      





マイクロソフトへの愛の瞬間。 ファイルが2番目のソースからダウンロードされたかどうかを確認したい場合は、 GOTOを使用する必要があります。これは、 IFおよびFORの内部で、 errorlevel%および%time%IFおよびFORを呼び出す前と同じであるためです



Goスクリプトは次のようになります。



 package main import ( "fmt" "os" "os/exec" ) func main() { url1 := "ftp://user:pass@88.88.88.88/test.zip" url2 := "ftp://user1:pass1@99.99.99.99/exchange/test.zip" out_file := ".\\test\\test.zip" // Go    ,     windows   . err := start_curl(url1, out_file) if err != nil { fmt.Printf("      : %v\r\n", err) err = start_curl(url2, out_file) if err != nil { fmt.Printf("      : %v\r\n", err) os.Exit(1) } } fmt.Printf("  \r\n") } func start_curl(url string, out_file string) error { cmd := exec.Command("curl", url, "-o", out_file) err := cmd.Run() return err }
      
      





ローンチを開始しましたが、デバッグのために、stderr / stdoutでcurlが生成するものを見るといいでしょう。 ところで、curlはすべてをstderrに表示します。



 func start_curl(url string, out_file string) error { cmd := exec.Command("curl", url, "-o", out_file) //cmd.Stdout = os.Stdout //     . cmd.Stderr = os.Stderr err := cmd.Run() return err }
      
      





エラーの場合、start_curl()関数は「exit code 7」のようなものを返します。 そして、数値の形式で戻りコードを受け取りたいです。 文字列「exit_code」を切り取り、文字列「7」を数値7に変換できます。 これを行うには、文字列とstrconvパッケージをインポートする必要があります。 しかし、より単純で、あまり明確ではない方法があります。



 package main import ( "fmt" "os" "os/exec" "syscall" ) func main() { url1 := "ftp://user:pass@88.88.88.88/test.zip" url2 := "ftp://user1:pass1@99.99.99.99/exchange/test.zip" out_file := ".\\test\\test.zip" int_err := start_curl(url1, out_file) if int_err != 0 { fmt.Printf("      : %d\r\n", int_err) int_err = start_curl(url2, out_file) if int_err != 0 { fmt.Printf("      : %d\r\n", int_err) os.Exit(int_err) } } fmt.Printf("  \r\n") } func start_curl(url string, out_file string) int { var exit_code int cmd := exec.Command("curl", url, "-o", out_file) //cmd.Stdout = os.Stdout //cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { exit_code = int(err.(*exec.ExitError).Sys().(syscall.WaitStatus).ExitCode) } else { exit_code = 0 } return exit_code }
      
      





今日は以上です。 コンパイラは、完成したexeファイルを収集します。 大きなサイズ(数メガバイト)を恐れる必要はありません。 最小ランタイムおよびすべての必要なパッケージは、このファイルに収集されます。 Goアプリのメモリ消費量は、perlやpythonの半分です(もちろん、小さなアプリケーションについて説明している場合を除きます)。 誰かがこの記事に興味を持っている場合は、コメントで私が検討したいトピックを示してください。






All Articles