Transmissionでダウンロードしてしばらく置いていましたが、まだ0%でした…
今週末に直接ダウンロードして見たいと思います。
Transmissionでダウンロードしてしばらく置いていましたが、まだ0%でした…
今週末に直接ダウンロードして見たいと思います。
昨日の続きです
テストクラス
package jp.boctok.sample8.systemout; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class SystemOutTest { /* System.outの代用のためのByteArrayStream */ private final ByteArrayOutputStream outStream = new ByteArrayOutputStream(); /* 元のSystem.out */ private final PrintStream orgOutStream = System.out; /* System.errの代用のためのByteArrayStream */ private final ByteArrayOutputStream errStream = new ByteArrayOutputStream(); /* 元のSystem.err */ private final PrintStream orgErrStream = System.err; @BeforeMethod public void beforeTest() { // System.outに代用のByteArrayStreamを出力させるように設定 System.setOut(new PrintStream(outStream)); // System.errに代用のByteArrayStreamを出力させるように設定 System.setErr(new PrintStream(errStream)); } @AfterMethod public void afterTest() { // System.outを元に戻す。 System.setOut(new PrintStream(orgOutStream)); // System.errを元に戻す。 System.setErr(new PrintStream(orgErrStream)); } @Test public void systemPrint() { // System.out.printのテスト String text = "print out"; System.out.print(text); assertThat(outStream.toString(), is(text)); // System.err.printのテスト text = "print err"; System.err.print(text); assertThat(errStream.toString(), is(text)); } }
printlnでなくprintにするのは、改行文字が入ってしまうからです。 printlnで評価する時は後ろに改行文字を付け足します。
実行すると
[TestNG] Running: /tmp/testng-eclipse--1818333339/testng-customsuite.xml PASSED: systemPrint =============================================== Default test Tests run: 1, Failures: 0, Skips: 0 =============================================== =============================================== Default suite Total tests run: 1, Failures: 0, Skips: 0 =============================================== [TestNG] Time taken by org.testng.reporters.JUnitReportReporter@3701eaf6: 3 ms [TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@35d176f7: 5 ms [TestNG] Time taken by org.testng.reporters.XMLReporter@3d99d22e: 4 ms [TestNG] Time taken by org.testng.reporters.EmailableReporter2@63e2203c: 2 ms [TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 0 ms [TestNG] Time taken by org.testng.reporters.jq.Main@59e5ddf: 16 ms
System.outに設定されているPrintStreamオブジェクトを取得可能な物にすることで値を参照することができました。 この場合、元に戻すのを忘れるとその後にSystem.outやSystem.errの挙動がおかしくなるので注意しましょう。
私は仕事でJavaを使うことが多いのですが、大抵裏方の方で画面まわりよりもバッチなどの方が多い。 そのため、テスト自体はInputとOutputが明確な事が多くて割合テストがしやすい事が多いのですが、バッチの作り方故に問題に上がるものも多いのでそれを書いておきます。
System.exitはそのままだとJVM自体終了するので自動テストの場合続行できなくなります。
SecurityManagerクラスをOverrideしてcheckExitメソッドの動きを変える。
方法はこちらを参照したと記憶しています。 JUnit System.exit するメソッドをテストする - Qiita
例 Exit1.java
/** * @author M.H * */ public class Exit1 { public static void f() { System.exit(0); } }
Exit2.java
/** * @author masataka * */ public class Exit2 { public static void f() { System.out.println("reached"); } }
テストクラス
import org.testng.annotations.Test; import jp.boctok.sample8.exit.Exit1; import jp.boctok.sample8.exit.Exit2; import org.testng.annotations.BeforeMethod; import static org.junit.Assert.assertTrue; import java.security.Permission; import org.testng.annotations.AfterMethod; /** * テストクラス * @author M.H * */ public class NewTest { /** * SecurityExceptionを継承した独自Exception * @author M.H * */ class ExitException extends SecurityException { /** serialVersionUID フィールド説明 */ private static final long serialVersionUID = 1L; public int s = 1; public ExitException(int s) { this.s = s; } } /** * テストメソッド */ @Test public void f() { try { Exit1.f(); }catch(ExitException e) { assertTrue(true); } Exit2.f(); assertTrue(true); } /** * テストメソッド実施前に実行 */ @BeforeMethod public void beforeMethod() { SecurityManager sm = new SecurityManager() { // こちらは特に何もしない // とは言ってもcheckExitから呼ばれてますが public void checkPermission(Permission p) { } @Override // このメソッドをいじる public void checkExit(int s) { throw new ExitException(s); } }; System.setSecurityManager(sm); } }
System.exit()メソッドの中は
public void exit(int status) { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkExit(status); } Shutdown.exit(status); //<--ここでJVMを終了させています }
といった感じです
こちらはPrintStreamオブジェクトにByteArrayOutputStreamのインスタンスを渡してあげる方法になります。 この方法は、JVMが動作している間その挙動になるため、テスト後に処理を戻す必要があります。
この続きは明日書きます。
現在の立場がDBAでSQLのパフォーマンスチェックと言う業務をやってるので、ここまでやってきたパフォーマンスの管理の方法を書いておく。
管理対象 | ツール |
---|---|
ファイル | Subversion |
スケジュール | Redmine |
SQLはプログラムから呼び出すため、条件式などが動的に変わる仕組みになっている。 そのため、そのパターンごとにチェックする必要がある。
例えば(下の例は架空のORマッパーもどきです)、
SELECT T1.I1, T2.I2, T1.I3 FROM TABLE1 T1 LEFT JOIN TABLE2 T2 ON T2.I1 = T1.I1 WHERE T1.I2 = ? AND <IF "I2<>NULL"> T2.I2 == ? AND </IF> T1.I3 = '0'
と言うSQLがあった場合、I2のパラメータがNULLかどうかでSQLの内容が変わります。
この場合、I2の条件ありバージョンとなしバージョンを作って、2つとも検証します。
こうした検証が必要なため、DBAとして、別途切り出して独自のSQLファイルを作ることになります。 これと、実際のプログラムで呼び出すSQLとの整合性をとるための管理が必要になりました。
この様なかんじで始めてみました
チェック内容は、アクセスパスチェックと書式などのチェックの2つなので、1回のチェックに2つのチケットが作られることになります。 アクセスパスチェックは、レビューを通して評価NGとなると再チェックの必要があるため、アクセスパスチェックからさらに評価NGごとにチケットを作るようにしました(この方式は賛否ありそうです)
SQLの評価コメントは別にExcelファイルがあるため、SubversionのリポジトリをRedmineに連携して参照できるようにしました。 Subversionで管理する物は評価用のExcelファイル、DBA管理のSQLファイルに絞り込んでます(DBA用のSVNで正式なSVNは別管理)。
チケットのコメントは、評価内容でNGになった部分、SQLの修正部分とインデックスの追加はルール化して後で検索しやすいようにしました。
当初は、SQL変更管理表というExcelが存在していましたが、こちらへの記述をしなくてもRedmineからだけで良くなればそれも廃止できそうです(SQL一覧とインデックス一覧は納品物なので廃止できません)。
ネットにつながらない、許可されたソフト意外使えないという制約の中、RedmineとSVN( IPA 独立行政法人 情報処理推進機構:定量的プロジェクト管理ツール(EPM-X) がありました。Gitはクライアントがなかったので断念)が使えたので、これまでの何でもExcelでの作業を少しでも軽減できるように持っていきたい。
今更発掘した、 www.meetup.com
この時のメモ
Elastic Cloudは有償
バージョンの組み合わせが分かりにくいので、全部5.0に統一
kibana4.4の後なので次から5.0から
現状α版
ingest beats→でパースしてelastic →elasticsearchとbeatsだけでできるようになる
script groovyからpainless scripting
kuromoji N-best cost/example 漢数字からアラビア数字に変換
プラグインコマンド変更 /bin/elasticsearch-plugin テキストフィールド アナライズする場合はtext、しない場合はkeyword
Netty3からNetty4
analyze API
es hadoop spark2.0に対応
kibana
5になるとカラフルになる 使い勝手は変わらない
マウスオーバーで
senseがデフォルトで搭載 Consoleと言う名前になる
csvでデータインポートできる
モニタリング機能 with X-Pack
地図 認証がかかって見えなくなってたのを改修
logstash
モニタリングAPIを付けた
IPV6対応
GEO IP2対応
モニタリングAPI Moar Metrics Moar Visibility
Beats
JSONがパースできるようになった フィルタリングできるようになった
Kafka
TopbeatからMetricbeatに名前が変わった
x-pack
個別にインストールしていたものを1つにした
Kibanaの画面をPDFに
cloud
AWS Elastic Cloud Elasic Cloud Enterprise
elastic{on} TOUR 東京2016 12/15
Use Cause of Elasticsearch AND Considerations in Multi-tenancy
プロダクト紹介 RDBとの連携
セルフ管理とAWS
PyData.Tokyo
再インデクシングの高速化
ちゃんと整理しないと
久しぶりにdocker-composeでELK(Elasticsearch,Logstash,Kibana)を動かしてみようと思った。
(後付け)最初につまづいた時点で、これ残しておくと解決に導く手順も残せそうと思い残してみることにした。
DBのアクセスパスチェックに使えたりしないかとふと思ったが、ELKをちゃんと使ったことがなかったので、まず使ってみよう。
どこかからdocker-compose.ymlを拾ってきて実行
ちょうど良さそうなので使ってみる。
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ git clone https://github.com/deviantony/docker-elk.git Cloning into 'docker-elk'... remote: Counting objects: 581, done. remote: Compressing objects: 100% (11/11), done. remote: Total 581 (delta 0), reused 0 (delta 0), pack-reused 570 Receiving objects: 100% (581/581), 110.68 KiB | 26.00 KiB/s, done. Resolving deltas: 100% (202/202), done. Checking connectivity... done. isoroku@akagi:git clone https://github.com/deviantony/docker-elk.git isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose up -d Unsupported config option for services service: 'elasticsearch' isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$
docker-composeのオプションを確認するとserviceと言うオプションは確かに無い
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose Define and run multi-container applications with Docker. Usage: docker-compose [options] [COMMAND] [ARGS...] docker-compose -h|--help Options: -f, --file FILE Specify an alternate compose file (default: docker-compose.yml) -p, --project-name NAME Specify an alternate project name (default: directory name) --verbose Show more output -v, --version Print version and exit Commands: build Build or rebuild services help Get help on a command kill Kill containers logs View output from containers port Print the public port for a port binding ps List containers pull Pulls service images restart Restart services rm Remove stopped containers run Run a one-off command scale Set number of containers for a service start Start services stop Stop services up Create and start containers migrate-to-labels Recreate containers to add labels
githubのページに行くと確かにこう書いてある Install Docker-compose version >= 1.6.
今入ってるバージョンは
@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose -v docker-compose version: 1.3.3 CPython version: 2.7.9 OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013
しばらく放置してたなあ…(ー▽ー;)
と言うわけで、docker-composeのアップデート
https://github.com/docker/compose/blob/master/CHANGELOG.md へ行って最新版の確認
今日現在 1.12.0 (2017-04-04)
Releases · docker/compose · GitHub へ行ってみると
curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
でインストールできると書いてある
一応、現在のdocker-composeのありかを確認
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ which docker-compose /usr/local/bin/docker-compose
配置場所は問題なさそうなのでそのまま実行する。 その前に、パーミッション確認
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ ls -l /usr/local/bin/ 合計 8096 -rwxr-xr-x 1 root root 8182592 6月 26 2016 docker-compose
sudo で実行だけど面倒なので sudo su -
してrootになってしまう。
後は上のコマンドを実行してしばらく待つ
root@akagi:~# curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 600 0 600 0 0 775 0 --:--:-- --:--:-- --:--:-- 774 82 8076k 82 6646k 0 0 9529 0 0:14:27 0:11:54 0:02:33 0 curl: (56) GnuTLS recv error (-54): Error in the pull function.
orz….
今はこっちかな…..○| ̄|_
とりあえずやり直し
2回め失敗
(4/15追記)
docker-compose は
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose -v docker-compose version 1.12.0, build b31ff33
バージョンは上がってるっぽいし、動くっぽい… この際だからこの状態で動くか見てみる。
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose Define and run multi-container applications with Docker. Usage: docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...] docker-compose -h|--help Options: -f, --file FILE Specify an alternate compose file (default: docker-compose.yml) -p, --project-name NAME Specify an alternate project name (default: directory name) --verbose Show more output -v, --version Print version and exit -H, --host HOST Daemon socket to connect to --tls Use TLS; implied by --tlsverify --tlscacert CA_PATH Trust certs signed only by this CA --tlscert CLIENT_CERT_PATH Path to TLS certificate file --tlskey TLS_KEY_PATH Path to TLS key file --tlsverify Use TLS and verify the remote --skip-hostname-check Don't check the daemon's hostname against the name specified in the client certificate (for example if your docker host is an IP address) --project-directory PATH Specify an alternate working directory (default: the path of the compose file) Commands: build Build or rebuild services bundle Generate a Docker bundle from the Compose file config Validate and view the compose file create Create services down Stop and remove containers, networks, images, and volumes events Receive real time events from containers exec Execute a command in a running container help Get help on a command images List images kill Kill containers logs View output from containers pause Pause services port Print the public port for a port binding ps List containers pull Pull service images push Push service images restart Restart services rm Remove stopped containers run Run a one-off command scale Set number of containers for a service start Start services stop Stop services top Display the running processes unpause Unpause services up Create and start containers version Show the Docker-Compose version information
旧バージョンではオプションだったversionサブコマンド
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose version docker-compose version 1.12.0, build b31ff33 docker-py version: 2.2.1 CPython version: 2.7.13 OpenSSL version: OpenSSL 1.0.1t 3 May 2016
ちゃんとバージョンが表示できた。
では、この状態で
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose up -d Creating network "dockerelk_elk" with driver "bridge" Building elasticsearch Step 1/1 : FROM docker.elastic.co/elasticsearch/elasticsearch:5.3.0 ---> ccec59a7dd84 Successfully built ccec59a7dd84 WARNING: Image for service elasticsearch was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Building logstash Step 1/1 : FROM docker.elastic.co/logstash/logstash:5.3.0 ---> b583a99a08a0 Successfully built b583a99a08a0 WARNING: Image for service logstash was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Building kibana Step 1/1 : FROM docker.elastic.co/kibana/kibana:5.3.0 ---> a21e19753b0c Successfully built a21e19753b0c WARNING: Image for service kibana was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Creating dockerelk_elasticsearch_1 Creating dockerelk_kibana_1 Creating dockerelk_logstash_1
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose ps Name Command State Ports ------------------------------------------------------------------------- dockerelk_elasti /bin/bash bin Exit 78 csearch_1 /es-docker dockerelk_kibana /bin/sh -c Up 0.0.0.0:5601->56 _1 /usr/local/bin/ 01/tcp ... dockerelk_logsta /usr/local/bin Up 0.0.0.0:5000->50 sh_1 /docker-entr ... 00/tcp
elasticsarchが立ち上がってない
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose start elasticsearch Starting elasticsearch ... done isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose ps Name Command State Ports ------------------------------------------------------------------------- dockerelk_elasti /bin/bash bin Exit 78 csearch_1 /es-docker dockerelk_kibana /bin/sh -c Up 0.0.0.0:5601->56 _1 /usr/local/bin/ 01/tcp ... dockerelk_logsta /usr/local/bin Up 0.0.0.0:5000->50 sh_1 /docker-entr ... 00/tcp
では、docker-compose up
したときの内容を見てみるけどWARNINGは出てるけど、特に問題なさそう。
あ、もしかしてパーミッションが…
確認すると、別ユーザで作成したディレクトリだったのでパーミッションがなかった。
なので、所有者を共通のグループに、パーミッションを775に設定してやりなおし。
まず、一度落としてから今度は、 docker-compose up
だけで実行
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose down Stopping dockerelk_logstash_1 ... done Stopping dockerelk_kibana_1 ... done Removing dockerelk_logstash_1 ... done Removing dockerelk_kibana_1 ... done Removing dockerelk_elasticsearch_1 ... done Removing network dockerelk_elk
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose up Creating network "dockerelk_elk" with driver "bridge" Creating dockerelk_elasticsearch_1 Creating dockerelk_logstash_1 Creating dockerelk_kibana_1 Attaching to dockerelk_elasticsearch_1, dockerelk_logstash_1, dockerelk_kibana_1 elasticsearch_1 | /bin/bash: bin/es-docker: Permission denied dockerelk_elasticsearch_1 exited with code 126 kibana_1 | fs.js:640 kibana_1 | return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode); kibana_1 | ^ kibana_1 | kibana_1 | Error: EACCES: permission denied, open '/usr/share/kibana/optimize/.babelcache.json' kibana_1 | at Error (native) kibana_1 | at Object.fs.openSync (fs.js:640:18) kibana_1 | at Object.fs.writeFileSync (fs.js:1333:33) kibana_1 | at save (/usr/share/kibana/node_modules/babel-core/lib/api/register/cache.js:35:19) kibana_1 | at _combinedTickCallback (internal/process/next_tick.js:67:7) kibana_1 | at process._tickCallback (internal/process/next_tick.js:98:9) kibana_1 | at Module.runMain (module.js:606:11) kibana_1 | at run (bootstrap_node.js:394:7) kibana_1 | at startup (bootstrap_node.js:149:9) kibana_1 | at bootstrap_node.js:509:3 dockerelk_kibana_1 exited with code 1 logstash_1 | Sending Logstash's logs to /usr/share/logstash/logs which is now configured via log4j2.properties logstash_1 | [2017-04-15T15:02:18,387][FATAL][logstash.runner ] An unexpected error occurred! {:error=>#<ArgumentError: Path "/usr/share/logstash/data" must be a writable directory. It is not writable.>, :backtrace=>["/usr/share/logstash/logstash-core/lib/logstash/settings.rb:420:in `validate'", "/usr/share/logstash/logstash-core/lib/logstash/settings.rb:202:in `validate_value'", "/usr/share/logstash/logstash-core/lib/logstash/settings.rb:118:in `validate_all'", "org/jruby/RubyHash.java:1342:in `each'", "/usr/share/logstash/logstash-core/lib/logstash/settings.rb:117:in `validate_all'", "/usr/share/logstash/logstash-core/lib/logstash/runner.rb:210:in `execute'", "/usr/share/logstash/vendor/bundle/jruby/1.9/gems/clamp-0.6.5/lib/clamp/command.rb:67:in `run'", "/usr/share/logstash/logstash-core/lib/logstash/runner.rb:183:in `run'", "/usr/share/logstash/vendor/bundle/jruby/1.9/gems/clamp-0.6.5/lib/clamp/command.rb:132:in `run'", "/usr/share/logstash/lib/bootstrap/environment.rb:71:in `(root)'"]} dockerelk_logstash_1 exited with code 1
もう一度docker-elkのgithubへ行ってみて、SELinuxのところを見ると
chcon -R system_u:object_r:admin_home_t:s0 docker-elk/
を実行しろと..
ただ、For example on Redhat and CentOS
Ubuntuの場合のchconコマンドは
masataka@akagi:/home/vm/virtualmachine/docker/elasticsearch$ chcon --help 使用法: chcon [OPTION]... CONTEXT FILE... または: chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE... または: chcon [OPTION]... --reference=RFILE FILE... 各 FILE の SELinux セキュリティコンテキストを CONTEXT に変更します。 --reference がある場合、各 FILE のセキュリティコンテキストを RFILE のものに 変更します。 Mandatory arguments to long options are mandatory for short options too. --dereference シンボリック自体の代わりに、シンボリックリンクを辿っ た先に適用する (この動作が既定)、 -h, --no-dereference 参照先のファイルの代わりにシンボリックリンクに適用する -u, --user=USER set user USER in the target security context -r, --role=ROLE set role ROLE in the target security context -t, --type=TYPE set type TYPE in the target security context -l, --range=RANGE set range RANGE in the target security context --no-preserve-root '/' を特別扱いしない (既定) --preserve-root '/' に対する再帰的な操作を失敗させる --reference=RFILE CONTEXT 値を指定するのに代わって RFILE の セキュリティコンテキストを使用する -R, --recursive ファイルとディレクトリを再帰的に操作する -v, --verbose 各ファイルを処理した時の診断を出力する 以下のオプションは -R オプションと併せて指定されたときにどのように階層を 横断するかの動作を変更します。2個以上指定されたときは最後のオプションの み有効になります。 -H コマンドライン引数がディレクトリに対するシンボ リックリンクの場合に、リンクを辿る -L ディレクトリに対するシンボリックリンクに遭遇し た時には全て辿る -P シンボリックリンクを辿らない (デフォルト) --help この使い方を表示して終了する --version バージョン情報を表示して終了する GNU coreutils online help: <http://www.gnu.org/software/coreutils/> chcon の翻訳に関するバグは <http://translationproject.org/team/ja.html> に連絡してください。 Full documentation at: <http://www.gnu.org/software/coreutils/chcon> or available locally via: info '(coreutils) chcon invocation'
こちらの記事を元に作って見ました。 環境設定がないとやはり再現できない原因がわからないなど困ることがありますね。
これだけだとただ書き写しただけなのでちょい足ししました。
関数を使って2通りの出力内容にした
出力オプションで-l:リスト形式、-t:テーブル形式で出力(getoptsを使用)
オプション違いはusageを出力
getoptsはbashのビルトインコマンドでコマンドライン引数を指定した変数に順次格納していくコマンドです。 書式は
getopts オプション文字の羅列 格納する変数
今回は-lと-tなのでオプション文字に「lt」と書きました。 値を設定するオプションの場合は:(コロン)を後ろにつけると変数OPTARGに値が保持されるので、値付きの場合はコロンをつけます。 例) -f table などとしたい場合 getopts f: OPT にすると、OPTにfが入った時に、OPTARGにtableが設定されます。
ファイル内容はこうなりました 当方Ubuntuなのでコマンドとかはちょっと変わります。
#!/bin/bash # 環境取得 DIST_FILE="/etc/lsb-release" MACHINE=$(uname -m) CPU=$(grep "model name" /proc/cpuinfo|head -1) MEM=$(grep "MemTotal" /proc/meminfo) DISTRIB=$(grep DISTRIB_ID $DIST_FILE) OS_VER=$(grep DISTRIB_RELEASE $DIST_FILE) OS_NAME=$(grep DISTRIB_CODENAME $DIST_FILE) KERNEL_VER=$(uname -o) # MarkDown 形式で出力 # リスト形式 list() { echo "- CPU ${CPU##*:}" echo "- MEMORY ${MEM##*:}" echo "- DISTRIBUTION ${DISTRIB#*=}" echo "- RELEASE VER ${OS_VER#*=}" echo "- CODE NAME ${OS_NAME#*=}" echo "- KERNEL $KERNEL_VER" } # テーブル形式 table() { echo "|カテゴリ|スペック|" echo "|:-|:-|" echo "|DISTRIBUTION|${DISTRIB#*=}|" echo "|RELEASE VER|${OS_VER#*=}|" echo "|CODE NAME|${OS_NAME#*=}|" echo "|KERNEL|$KERNEL_VER|" } # usage usage() { echo "usage:" echo "$0 [-l|-t]" echo "-l:list / -t:table" } if [ $# -ne 1 ]; then usage exit -1 fi echo "#### 検証環境" echo "" while getopts lt OPT do case $OPT in "l") list;; "t") table;; *) usage;; esac done
-tの時の出力
カテゴリ | スペック |
---|---|
CPU | Intel® Core™ i5-2500 CPU @ 3.30GHz |
MEMORY | 16318172 kB |
DISTRIBUTION | Ubuntu |
RELEASE VER | 16.04 |
CODE NAME | xenial |
KERNEL | GNU/Linux |