POSIX1日1コマンド[part8]: batch
詳細はこちらの記事へ。1日1POSIXコマンドを実行してみようというやつです。
batch
とりあえず使ってみる
$ sudo systemctl status atd ● atd.service - Job spooling tools Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2018-02-25 23:50:07 UTC; 22s ago Main PID: 3314 (atd) CGroup: /system.slice/atd.service └─3314 /usr/sbin/atd -f Feb 25 23:50:07 localhost.localdomain systemd[1]: Started Job spooling tools. Feb 25 23:50:07 localhost.localdomain systemd[1]: Starting Job spooling tools...
起動していなければ、
$ sudo systemctl start atd
・使う
# 事前のディレクトリ確認 $ ls jobs # jobの内容を表示 $ cat jobs echo `date` >> sample.log # batchコマンドに渡す $ cat jobs | batch job 22 at Mon Mar 5 19:03:00 2018 # 実行されている事がわかる $ ls jobs sample.log # コマンドの実行結果がsample.logに追記されている。 cat sample.log Mon Mar 5 19:03:23 UTC 2018
・複数回キューに追加してみる
# 複数回実行 $ cat jobs | batch job 33 at Mon Mar 5 19:12:00 2018 $ cat jobs | batch job 34 at Mon Mar 5 19:12:00 2018 $ cat jobs | batch job 35 at Mon Mar 5 19:12:00 2018 $ cat jobs | batch job 36 at Mon Mar 5 19:12:00 2018 $ cat jobs | batch job 37 at Mon Mar 5 19:12:00 2018 $ cat jobs | batch job 38 at Mon Mar 5 19:12:00 2018 $ cat jobs | batch job 39 at Mon Mar 5 19:12:00 2018 $ cat jobs | batch job 40 at Mon Mar 5 19:12:00 2018 # sample.logを確認 $ cat sample.log Mon Mar 5 19:05:53 UTC 2018
この時点では追加されてい無い事がわかる。
# キューの内容内容を確認 # bというキューにたくさんキューがたまっている $ atq 33 Mon Mar 5 19:12:00 2018 b vagrant 34 Mon Mar 5 19:12:00 2018 b vagrant 35 Mon Mar 5 19:12:00 2018 b vagrant 36 Mon Mar 5 19:12:00 2018 b vagrant 37 Mon Mar 5 19:12:00 2018 b vagrant 38 Mon Mar 5 19:12:00 2018 b vagrant 39 Mon Mar 5 19:12:00 2018 b vagrant 40 Mon Mar 5 19:12:00 2018 b vagrant # 少し時間を置く $ atq 35 Mon Mar 5 19:12:00 2018 b vagrant 36 Mon Mar 5 19:12:00 2018 b vagrant 37 Mon Mar 5 19:12:00 2018 b vagrant 38 Mon Mar 5 19:12:00 2018 b vagrant 39 Mon Mar 5 19:12:00 2018 b vagrant 40 Mon Mar 5 19:12:00 2018 b vagrant
少し時間がたってキューの中身が減っているのがわかる。
キュー内のコマンドが実行されたことを意味するので、sample.log
にも処理内容が追記されている。
$ cat sample.log Mon Mar 5 19:14:53 UTC 2018 Mon Mar 5 19:15:53 UTC 2018 Mon Mar 5 19:16:53 UTC 2018
batch を知る
ざっくり使い方
<command> | batch
ざっくりDESCRIPTION
バッチ・キュー内で実行されるコマンドをスケジュールする。
標準入力からコマンドを読み取り、バッチ・キュー内で実行するようにスケジュールします。それは以下のコマンドと同等です:
at -q b -m now
(atコマンドで 「b」というキュータスクを追加する。) ここで、キューbは特別なキュー、特にバッチ・ジョブ用です。バッチ・ジョブは、時間制約なしでバッチ・キューに提出され、バッチの呼び出しごとに異なる不特定の要因に基づいてアルゴリズムを使用してシステムによって実行されます。
実装定義のディレクトリにあるat.allow(/etc/at.allow)ファイルに名前が表示されている場合、ユーザはバッチを使用することが許可されます。そのファイルが存在しない場合、実装定義のディレクトリにあるat.deny(/etc/at.deny)ファイルをチェックして、ユーザがバッチへのアクセスを拒否されるかどうかを判断しなければなりません。いずれのファイルも存在しない場合、適切な特権を持つプロセスだけがジョブをサブミットすることが許されます。 at.denyだけが存在し、空である場合、グローバルな使用が許可されます。 at.allowファイルとat.denyファイルは、1行に1つのユーザー名で構成されます。
ざっくりOPTION
なし(batchコマンド自体にはなし)
ざっくりOPERANDS
なし(batchコマンド自体にはなし)
ざっくりまとめ
以前に使ってみた、atコマンド
の 「負荷が少ないときに処理を実行するバージョン」だそうです。
atコマンドをざっくりとしか使ってい無いため、使用感まではわかりませんでしたが、処理に時間がかかり、他の処理を優先させたい場合にbatch
を使うのは良いかもしれません。
また、
man batch
を実行すると、atコマンド
のmanが表示され、その中の一つの要素としてbatch
が存在します。
Go言語_初心者_環境作りからHello Worldまで
Go言語の勉強をそろそろはじめないと、社会の波に乗り遅れそうな気がしてきました。
初心者かつ、仕事であまりプログラミングをしない。
ので、効率よく勉強を進めれるか分かりませんが、とりあえず社会の波に揺られるぐらいにはなりたい。
そして、今回の記事は水辺に片足突っ込むための、
- 環境づくりからHello World
までです。
何から始めるか
Goの事をちょっと調べたら、とりあえず、A Tour of Go から始めようってなりますよね。
とりあえず、A Tour of Go
を写経するツアーに参加するのはいかがでしょうか?
私はそうすることにしたいと思います。
それと平行して、環境を用意したいと思います。
環境
自分の環境
- Vagrant
- CentOS7
- GO
- 1.9.4
手順
Goを使えるようにする
vim-goを使えるようにする。
Go本体
バイナリをダウンロード、適切なディレクトリに配置
Downloads - The Go Programming Language
このリンクのFeatured downloads
から対象マシン(私の場合はLinux)を右クリックしてリンクのアドレスを取得する。そしてインストールする。
curl -LO https://dl.google.com/go/go1.9.4.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.9.4.linux-amd64.tar.gz
.bash_profileにパスを通す記述を追記
echo "export PATH=$PATH:/usr/local/go/bin" > ~/.bash_profile source ~.bash_profile
$ go Go is a tool for managing Go source code. Usage: go command [arguments] The commands are: build compile packages and dependencies clean remove object files doc show documentation for package or symbol env print Go environment information bug start a bug report fix run go tool fix on packages fmt run gofmt on package sources generate generate Go files by processing source get download and install packages and dependencies install compile and install packages and dependencies list list packages run compile and run Go program test test packages tool run specified go tool version print Go version vet run go tool vet on packages Use "go help [command]" for more information about a command. ・ ・ ・
vim-goを使えるようにする。
Vim 8 for CentOS Linux 7 – Karanbir Singh :: Thinkability @karan.org
GitHub - fatih/vim-go: Go development plugin for Vim
これらを参考に、vim8 + vim-go使えるようにする。
$ sudo vim /etc/yum.repos.d/vim8.repo
[mcepl-vim8] name=Copr repo for vim8 owned by mcepl baseurl=https://copr-be.cloud.fedoraproject.org/results/mcepl/vim8/epel-7-$basearch/ type=rpm-md skip_if_unavailable=True gpgcheck=1 gpgkey=https://copr-be.cloud.fedoraproject.org/results/mcepl/vim8/pubkey.gpg repo_gpgcheck=0 enabled=1 enabled_metadata=1
:qw
vimを一度アンインストールし、またインストールする
- sudoが一度消えますが、またyumでインストールできます。
$ sudo yum remove vim-minimal-2:7.4.160-2.el7.x86_64 # sudoがないのでrootになる $ su $ yum install sudo $ sudo yum install vim
git clone https://github.com/fatih/vim-go.git ~/.vim/pack/plugins/start/vim-go
vim-goでつかうバイナリをダウンロード
$ vim
:GoInstallBinaries
これでダウンロードができるはずです。
Hello World
Goの「Hello World」書く
vim hello.go
package main import "fmt" func main() { fmt.Println("vim-go") }
vim-goがここまで勝手に書いてくれている。
package main import "fmt" func main() { fmt.Println("Hello World") }
実行
$ go run hello.go Hello World
$ ls hello.go $ go build hello.go $ ls hello hello.go ./hello Hello world
POSIX1日1コマンド[part7]: basename
詳細はこちらの記事へ。1日1POSIXコマンドを実行してみようというやつです。
basename
とりあえず使ってみる
$ ls a.txt $ basename a.txt a.txt # suffixを指定 $ basename a.txt .txt a
$ pwd /home/vagrant/shells/006 $ basename `pwd` 006
$ ps aux | grep chronyd chrony 556 0.0 0.3 115640 1776 ? S Feb25 0:00 /usr/sbin/chronyd vagrant 3805 0.0 0.1 12448 676 pts/0 R+ 04:05 0:00 grep --color=auto chronyd ps aux | grep chronyd $ ps aux | grep chronyd | awk '{ print $11 }' | head -n 1 /usr/sbin/chronyd $ basename $(ps aux | grep chronyd | awk '{ print $11 }' | head -n 1) chronyd
basename を知る
ざっくり使い方
basename string [suffix]
ざっくりDESCRIPTION
パス名のディレクトリじゃない部分を返す。文字列のオペランドは XBD pathname
で定義されているパス名として扱われる。
文字列は、文字列中の最後のパス名に対応するファイル名に変換され、その後に接尾辞文字列接尾辞があればそれを削除するものとする。これは、次のステップに相当するアクションを順番に実行することによって行われます。
- stringがヌル字列の場合、結果の文字列が '.'かどうかは不明です。もしくは、ヌル文字列です。いずれの場合も、手順2〜6はスキップしてください。
- stringが"//"の場合、ステップ3〜6がスキップされるか処理されるかどうかは、実装定義である。
- stringが全てスラッシュで構成されている場合、文字列は単一のスラッシュ文字に設定されます。この場合は、手順4〜6をスキップしてください。
- stringの最後にスラッシュがある場合、それらは削除される
- stringにスラッシュが残っている場合、文字列中の最後のスラッシュまでの文字列の接頭辞は削除されます。
- suffixスオペランドが存在し、stringに残っている文字と同一ではなく、stringに残っている文字のsuffixと同じである場合、接尾辞,suffixは文字列から削除されます。それ以外の場合、このステップでは文字列は変更されません。文字列に接尾辞が見つからない場合は、エラーとみなされません。
補足資料
ざっくりOPTION
なし
ざっくりOPERANDS
basename <string>
basename <suffix>
ざっくりまとめ
パスを渡すと最後パスの最後の部分を抜き出してくれる。
正直basenameをいつ使うのか思いつきません。
いっぱいパス処理しないといけなくて、かつ拡張子が不必要な場合とかに使えるだろうか。
== 活用方法募集中 ==
POSIX1日1コマンド[part6]: awk
詳細はこちらの記事へ。1日1POSIXコマンドを実行してみようというやつです。
awk
とりあえず使ってみる
$ ls -la total 0 drwxrwxr-x. 2 vagrant vagrant 45 Feb 26 01:55 . drwxrwxr-x. 5 vagrant vagrant 51 Feb 26 01:53 .. -rw-rw-r--. 1 vagrant vagrant 0 Feb 26 01:54 a.txt -rw-rw-r--. 1 vagrant vagrant 0 Feb 26 01:54 b.txt -rw-rw-r--. 1 vagrant vagrant 0 Feb 26 01:54 c.txt $ls -la | awk '{ print "owner is " $3 ", filename is "$9 }' owner is , filename is owner is vagrant, filename is . owner is vagrant, filename is .. owner is vagrant, filename is a.txt owner is vagrant, filename is b.txt owner is vagrant, filename is c.txt
awk を知る
ざっくり使い方
awk [-F sepstring] [-v assignment]... program [argument...] awk [-F sepstring] -f progfile [-f progfile]... [-v assignment]... [argument...]
ざっくりDESCRIPTION
パターンをスキャンし処理するプログラム言語の一つ。テキストデータの処理に特化している。一連のパターンと対応するアクション。パターンと一致する入力が読み取られると、そのパターンに関連付けられたアクションが実行される。
入力は一連のレコードとして認識される。デフォルトでは、レコードは行で、改行で終了します。ですがこれは、RS
という組み込み変数を使うと変更することができます。
入力の各レコードは、順番にプログラムの各行と照合される。一致した各行は、関連するアクションを実行しなければならない。
awkは各入力のレコードを一連のフィールドとして解釈する。デフォルトでのフィールどの文字列は、「空白」、「改行」以外の文字です。このデフォルトの「空白」、「改行」という区切り文字は、FS
という組み込み変数、もしくは -F
オプションで変更できる。
レコードのフィールドは、最初の文字から $1
$2
... で使えます。
また、$0
はレコード全体を示します。他のフィールドを設定すると $0
の再評価が行われる。$ 0に代入すると、他のすべてのフィールドとNF組み込み変数の値がリセットされる。
ざっくりOPTION
- -F
- フィールド区切り文字を定義します。ただし、-F <区切り文字>と-v FS = <区切り文字>の両方が使用されている場合、-F <区切り文字>からのFS割り当てがコマンド行順で処理されるか、最後の-v FS = <区切り文字>の後で処理されるかは不特定です。
- -f progfile
- -v assignment
ざっくりOPERANDS
awk programfile
ざっくりまとめ
awkは行区切りで表示されるデータの一部の値を取得したいときや使いたいときに非常に便利なコマンドですね。-F
だけでも覚えておけば、日々の業務を楽にできる可能性があります。
$cat sample.csv 1,dog,200 2,cat,300 3,bird,50 4,cow,400 5,rabbit,200 $cat sample.csv | awk -F ',' '{ print $2 }' dog cat bird cow rabbit
2番目のフィールの動物の名前を取得した。
上記例の通り、CSVなど特定の区切り文字が利用されているデータにはもってこいじゃないでしょうか。
そしてawkは奥が深いのでさらに深く知りたい人は、
sed & awkプログラミング 改訂版 (A nutshell handbook)
- 作者: Dale Dougherty,Arnold Robbins,福崎俊博
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 1997/10/01
- メディア: 大型本
- 購入: 2人 クリック: 48回
- この商品を含むブログ (34件) を見る
これを買いましょう。
POSIX1日1コマンド[part5]: at
詳細はこちらの記事へ。1日1POSIXコマンドを実行してみようというやつです。
at
とりあえず使ってみる
$ sudo yum install at $ sudo systemctl status atd ● atd.service - Job spooling tools Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2018-02-25 23:50:07 UTC; 22s ago Main PID: 3314 (atd) CGroup: /system.slice/atd.service └─3314 /usr/sbin/atd -f Feb 25 23:50:07 localhost.localdomain systemd[1]: Started Job spooling tools. Feb 25 23:50:07 localhost.localdomain systemd[1]: Starting Job spooling tools...
起動していなければ、
$ sudo systemctl start atd
$ touch dummy-file1 dummy-file2 $ ls dummy-file1 dummy-file2 $ echo 'rm dummy-file2' > at_task $ date Sun Feb 25 23:56:50 UTC 2018 $ ls at_task dummy-file1 dummy-file2 $ at -f at_task 23:58 job 4 at Sun Feb 25 23:58:00 2018 $ date Sun Feb 25 23:57:21 UTC 2018 $ ls at_task dummy-file1 dummy-file2 $ date Sun Feb 25 23:58:03 UTC 2018 $ ls at_task dummy-file1 #dummy-file2が消えている
atで指定した時間にコマンドを実行した。
at を知る
ざっくりDESCRIPTION
後でコマンドを実行する。標準入力からコマンドを読み取り、後で実行されるat-jobとしてグループ化する。
at-jobは別でのシェルで実行され、制御して無いターミナルのプロセスグループとして分けられる。
環境変数、現在の作業ディレクトリ、ファイル作成マスク、およびatユーティリティが実行されたときに有効になる他のimplementation-definedの実行時間属性は、at-jobが実行されるときに、atユーティリテーは保持され使用されるものとし、実行される。
at-jobがsubmitされると、at_job_idとスケジュールされた時間は、標準エラー出力に書き込まれる。
at_job_idは英数字とピリオドからなる識別子です。
ジョブが特定のジョブを一意に識別するようにスケジュールされている場合、at_job_idはシステムによって割り当てられたものとする。
ざっくり使い方
at [-m] [-f file] [-q queuename] -t time_arg
at -r at_job_id...
ざっくりOPTION
-f file
- 標準入力の代わりに、at-jobのソースとして使用するファイルのパス名を指定する。
-l
- at_job_idが指定されていない場合は、起動するユーザーに対してスケジュールされたすべてのジョブを出力する。 at_job_idsが指定されている場合は、これらのジョブの情報のみを出力する。出力は標準出力に書き込まれます。
-m
- at-jobが実行された後、呼び出し元のユーザーに完了のメールを送信する。at-jobによって生成された標準出力と標準エラーは、他の場所にリダイレクトされ無い限り、同様にユーザーに送られる。
- -q
- -r
- -t
ざっくりOPERANDS
- at_job_id
- 前回atユーティティーでジョブをスケジュールしたときに出力された名前
- timespec
- 多かったので割愛しますが、実行する時間の設定方法が本家サイトには載っています。
ざっくりまとめ
POSIX1日1コマンド[part4]: asa
詳細はこちらの記事へ。1日1POSIXコマンドを実行してみようというやつです。
asa
asa を知る
ざっくりDESCRIPTION
キャリッジコントロール文字を解析する。(?)
入力ファイルを標準出力に出力し、テキストファイルからキャリッジコントロール文字を処理系定義の方法で、ラインプリンター制御シーケンスにマッピングする。
全ての行の最初の文字が削除され、以下の処理が実行される
削除された文字
- スペース
- 残りの行はそのまま出力される
- 0
- 改行が出力され、残りの行も出力される
- 1
- 処理系定義文字が次のページに進むために出力され、残りの入力行が続く
- +
- 前の行の改行は、一つ以上のの処理系定義文字をプリントし、列の位置を一つ戻り、残りのの入力が続く。+が最初の文字の場合はスーペースと同じ処理になる。
キャリッジコントロール文字とは?
carriage-control characters
がわからなかったので調べてみた。
単純に「キャリッジコントロール」で調べてもでてこない。だが、改行コードの話はでてくる。
キャリッジ・リターン(carriage return)は本来、テレタイプ端末の Baudot Code における制御文字を指す用語で、行末から行頭に戻す復帰コードであって、改行コードを含まない。その後、タイプライターで一行打ち込んだ後で紙を固定するシリンダー(キャリッジ)を次の行の先頭にタイプできるように戻し(リターン)改行する機構(またはその機構を操作するレバー)を「キャリッジ・リターン」と呼んだ。
キャリッジコントロール文字はおそらく、文字の復帰等を制御する文字だと仮定した。
ラインプリンター制御シーケンスとは?
line-printer control sequences
(ラインプリンター制御シーケンス)も分からなかったので調べてみた。
そもそもラインプリンターとは
行印字装置だそう。
ラインプリターを制御するシーケンスということでしょう。
ざっくり使い方
asa <file>
ざっくりOPTION
オプションは無い
ざっくりOPERANDS
asa <file>
ファイルが指定されていない場合は標準入力が使用される。
ざっくりまとめ
おそらく、ラインプリンターを使うときに使うコマンドだと思います。 自分の環境で試そうとしたところ、
[vagrant@localhost 003]$ asa -bash: asa: command not found
となりました。 ラインプリターが統合されているUNIXマシンではasaコマンドが使えるのでしょうか。
詳しい方もしこの記事を見つけたら教えてください.
POSIX1日1コマンド[part3]: ar
詳細はこちらの記事へ。1日1POSIXコマンドを実行してみようというやつです。
ar
使い方がよくわからなかった上に英語がつらくなったのでこちらも参考にさせていただいた。
オプションは後日追記予定
Man page of ar
ar を知る
ざっくりDESCRIPTION
ライブラリのアーカイブの作成と管理をするコマンド。Software Development Utilitiesのオプションの一つ。
アーカイブにまとめられたファイルのグループを作成、管理する。アーカイブが作成されると、新しいファイルを追加したり、アーカイブ内のすでに存在するファイルを抽出したり、消したり、置き換えたりできる。
ざっくりOPTION
後日追加
ざっくりOPERANDS
$ ar <archive>
アーカイブのパス名
$ ar <file>
パス名。アーカイブ内のファイル名と比較する場合は、最後のコンポーネントのみを使用する。 2つ以上のファイルオペランドが同じ最終パス名コンポーネント(basename)を持つ場合、結果は未指定()です。インプレメンテーションズアーカイブフォーマットは、アーカイブに追加または置換されたファイルの有効なファイル名を切り捨ててはならない。
ざっくり使ってみる
$ ar -s hoge ar: hoge: File format not recognized
ファイル形式が認識されない
$ ar Usage: ar ... ... ar: supported targets: elf64-x86-64 elf32-i386 elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big plugin srec symbolsrec verilog tekhex binary ihex
サポートされているのは以下の形式のファイルのよう
- elf64-x86-64
- elf32-i386
- elf32-x86-64
- a.out-i386-linux
- pei-i386
- pei-x86-64
- elf64-l1om
- elf64-k1om
- elf64-little
- elf64-big
- elf32-little
- elf32-big
- plugin
- srec
- symbolsrec
- verilog
- tekhex
- binary
- ihex
うむ。elfってのをざっくりわかるぐらい。
上記に記載した日本語のmanページのリンクでも書いているが、対象はバイナリファイルのよう。
ざっくりまとめ
ほぼ、使い方がわからなかった。実際使うことも少なそう。tarというコマンドがあるが、関係があるのだろうか。 継続2日目