20200720のLinuxに関する記事は7件です。

SSH でログアウトした後もプロセスを残す

はじめに

SSH接続している際に、ログアウト後もプロセスを持続させる方法のメモです。
やりたいことは基本的にはこれでできます。

$ nohup コマンド内容 > out.log &

$ nohup echo "very very heavy task" > out.log &

これを実行すると、カレンドディレクトリに out.log ファイルが作成され、出力内容が保存されます。

out.log
very very heavy task

関数化

ここからがメインです。先程のコマンドはちょっと長いので、関数として登録します。

僕が使用しているシェルは zsh なので ~/.zshrc に次の内容を追記します。
bash の場合は ~/.bashrc に追記してください。

.zshrc
background () {
    nohup ${@:1} > out.log &
}

内容を保存して、変更内容を適応します。

$ source ~/.zshrc

これで実行したいプロセスの先頭に background を付けるだけで、バックグラウンド実行することができます。

$ background echo "very very heavy task"

引数がいくつあっても大丈夫です。

$ background python takes_many_args.py foo bar --arg3 1234 --arg4 abcd
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SSH でログアウトした後もプロセスを残すメモ

はじめに

SSH接続している際に、ログアウト後もプロセスを持続させる方法のメモです。
やりたいことは基本的にはこれでできます。

$ nohup コマンド内容 > out.log &

$ nohup echo "very very heavy task" > out.log &

これを実行すると、カレンドディレクトリに out.log ファイルが作成され、出力内容が保存されます。

out.log
very very heavy task

関数化

ここからがメインです。先程のコマンドはちょっと長いので、関数として登録します。

僕が使用しているシェルは zsh なので ~/.zshrc に次の内容を追記します。
bash の場合は ~/.bashrc に追記してください。

.zshrc
background () {
    nohup ${@:1} > out.log &
}

内容を保存して、変更内容を適応します。

$ source ~/.zshrc

これで実行したいプロセスの先頭に background を付けるだけで、バックグラウンド実行することができます。

$ background echo "very very heavy task"

引数がいくつあっても大丈夫です。

$ background python takes_many_args.py foo bar --arg3 1234 --arg4 abcd
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ArcoLinux v20 xfce install

ArcoLinux v20 xfce をインストールしました。
v19からのUPDATEはかなり苦しいようです。
Rollingリリースのはずなのに、そこはどうなんでしょうね?
裏切られた感は半端ないです。
この辺はメインマシンには出来ない! と判断せざるを得ません。

使用機材は FMV core 2 duo のオールドマシンです。
インストール画面 ↓
arco550.jpeg

古いマシンですから
tab (space) EDD=OFF の書き足し
が必要でした。
このときキーボードは英語キーになっています。
「=」は日本語キーの「=」の右隣にあるはずです ご注意下さい。

お使いのマシンによって条件が変わりますから
色々試してみてください。
xfceらしい軽量軽快で使いやすいディストロです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

grepコマンドの使い方

grepコマンド

正規表現でマッチする行を検索するコマンド

構文

grep [オプション] パターン [ファイル]
ex: grep -n abc aaa.txt

重要度

★★★★★(5/5)
必須。これを覚えていないと普段の業務に支障が出るレベル。

オプションたち

覚えたいオプション

  • -e : 正規表現を使う(regexのe?)
  • -n : 検索結果に行番号を表示する(number。よくある省略)
  • -C5 : 検索結果に一致した箇所から前後に指定した5行表示する(行数は任意。多分Cに意味はない、A,B,Cでそれぞれ一致した前、あと、前後なので、ABCどれかだなと覚えればよいかも)
  • -r : ディレクトリ内も検索対象とする(recursive。よくある省略)
  • -i : 大文字と小文字を区別せず検索する(case insensitiveのi。多分。。。)

できれば覚えたいオプション

  • -v : 一致しないもの
  • -B3 : 一致した前3行を表示する(数は任意の数字)
  • -A2 : 一致した後2行を表示する(数は任意の数字)

覚えなくてもよさそうなオプション(ひとそれぞれですが)

  • -E : 拡張正規表現で検索を行う
  • -l : 検索結果にファイル名のみ表示する
  • -h : 検索結果にファイル名を表示しない
  • -o : 検索結果に一致した文字を表示する
  • -L : 該当しないファイルを表示する

サンプル

  • grep '^A' sample.csv → 行の頭にAがついている
  • grep '[0-9]' sample.csv → '[0-9]'の文字列が含まれている行を抽出
  • ps aux | grep python → pythonという文字が含まれているプロセスを抽出
  • grep -v '^A' sample.csv → 行の頭にAがついていない
  • grep -e aaa -e bbb sample.csv → aaaとbbbどちらかが含まれる行を抽出
  • grep -i aaa sample.csv → 大文字小文字を区別せず、aaaが含まれる行を抽出

appendix

grepでAND検索したい場合

grep aaa sample.csv | grep bbb

→ aaaが含まれているものに絞って、さらにbbbが含まれているものに絞る

grepでOR検索したい場合

grep -e hoge -e fuga sample.csv

→ -eオプションを複数回繰り返す。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

grepコマンドの使い方と頻出サンプル

grepコマンド

正規表現でマッチする行を検索するコマンド

構文

grep [オプション] パターン [ファイル]
ex: grep -n abc aaa.txt

重要度

★★★★★(5/5)
必須。これを覚えていないと普段の業務に支障が出るレベル。

オプションたち

覚えたいオプション

  • -e : 正規表現を使う(regexのe?)
  • -n : 検索結果に行番号を表示する(number。よくある省略)
  • -C5 : 検索結果に一致した箇所から前後に指定した5行表示する(行数は任意。多分Cに意味はない、A,B,Cでそれぞれ一致した前、あと、前後なので、ABCどれかだなと覚えればよいかも)
  • -r : ディレクトリ内も検索対象とする(recursive。よくある省略)
  • -i : 大文字と小文字を区別せず検索する(case insensitiveのi。多分。。。)

できれば覚えたいオプション

  • -v : 一致しないもの
  • -B3 : 一致した前3行を表示する(数は任意の数字)
  • -A2 : 一致した後2行を表示する(数は任意の数字)

覚えなくてもよさそうなオプション(ひとそれぞれですが)

  • -E : 拡張正規表現で検索を行う
  • -l : 検索結果にファイル名のみ表示する
  • -h : 検索結果にファイル名を表示しない
  • -o : 検索結果に一致した文字を表示する
  • -L : 該当しないファイルを表示する

サンプル

  • grep '^A' sample.csv → 行の頭にAがついている
  • grep '[0-9]' sample.csv → '[0-9]'の文字列が含まれている行を抽出
  • ps aux | grep python → pythonという文字が含まれているプロセスを抽出
  • grep -v '^A' sample.csv → 行の頭にAがついていない
  • grep -e aaa -e bbb sample.csv → aaaとbbbどちらかが含まれる行を抽出
  • grep -i aaa sample.csv → 大文字小文字を区別せず、aaaが含まれる行を抽出

appendix

grepでAND検索したい場合

grep aaa sample.csv | grep bbb

→ aaaが含まれているものに絞って、さらにbbbが含まれているものに絞る

grepでOR検索したい場合

grep -e aaa-e bbb sample.csv

→ -eオプションを複数回繰り返す。aaaを含む行とbbbを含む行を取り出す。

特定のファイル名のものを抽出したい

ls ./ | grep aaa

→カレントディレクトリ(現在のディレクトリ)にあるaaa(ファイル名)を含むファイルを抽出。

特定の内容を含むファイルを抽出したい

grep aaa -rl ./

→カレントディレクトリ(現在のディレクトリ)にあるファイルの中身にaaaが含まれるもの

実行したコマンドの履歴から特定の文字列を含む直近のコマンドを調べたい

history | grep aaa | tail

→ヒストリーコマンドからaaaを含むコマンドを抽出。tailで最後の5つに絞り込む。

まとめ

grepコマンドは必須なので、しっかり覚えておくことをおすすめします!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerfile:LinuxサーバにDockerをインストールする

このチュートリアルでは、Alibaba Cloud上でのDockerfileの使用方法について実践的な経験を積むことに焦点を当てています。

本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。

Dockerfile HEALTHCHECK

このセクションでは、DockerfileでのHEALTHCHECKの使い方を説明します。

HEALTHCHECKは、指定したスケジュールでコンテナの健全性を自動チェックします。

HEALTHCHECK [OPTIONS] CMDコマンド

CMDの前に表示されるオプションは、以下の通りです。

--interval=DURATION (default: 30s)
--timeout=DURATION (default: 30s)
--start-period=DURATION (default: 0s)
--retries=N (default: 3)

このチュートリアルでは、これらの時間は非常に長いです。すぐにテストして、チェックが機能するのを確認したいのです。

これをDockerfileに追加するには

nano Dockerfile

FROM alpine:3.8
HEALTHCHECK --interval=3s --timeout=1s \
   CMD curl -f http://localhost/ || exit 1

重要: この特定の Alpine コンテナでは、curl -f http://localhost/ health check コマンドは常に失敗することに注意してください。

イメージをビルドするには

docker build --tag tutorial:demo --file Dockerfile  .

コンテナを起動して結果を見てみましょう。

docker stop -t 0 tutorial ; docker container prune -f  
docker run -ti -d --name tutorial tutorial:demo /bin/sh -c 'while true; do sleep 60; done’

コンテナが起動したら、docker ps -aを1秒ごとに(10秒間)繰り返し実行して、ヘルスチェックの進行状況を確認します。

docker ps -a

期待される出力。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                           PORTS               NAMES

27134771d5dd        tutorial:demo       "/bin/sh -c 'while t�"   3 seconds ago       Up 1 second (health: starting)

10秒後に以下のようになります。

docker ps -a

期待される出力。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES

27134771d5dd        tutorial:demo       "/bin/sh -c 'while t�"   12 seconds ago      Up 10 seconds (unhealthy)                       tutorial

(health:starting)は10秒間表示されますが、チェックは3秒間隔で行われるので ( --interval=3s)、 --timeout=1sを指定しています。

この間隔を1秒に短縮して、より早くヘルスの結果を表示できるようにしましょう。

また、リトライ回数をデフォルトの3回から1回に減らしてみましょう。--retries=1

PROD環境ではretries = 1を使うことはほぼないでしょう。3の方がはるかに現実的な値です。

これをDockerfileに追加するには

nano Dockerfile

FROM alpine:3.8
HEALTHCHECK --interval=1s --timeout=1s --retries=1 \
   CMD curl -f http://localhost/ || exit 1

を使用して画像を構築します。

docker build --tag tutorial:demo --file Dockerfile  .

コンテナを起動して結果を見てみましょう。

docker stop -t 0 tutorial ;   docker container prune -f  
docker run -ti -d --name tutorial tutorial:demo /bin/sh -c 'while true; do sleep 60; done';docker ps -a; sleep .4; docker ps -a; sleep .4; docker ps -a; sleep .4; docker ps -a; sleep .4;

コンテナの状態を 0.4 秒ごとにチェックしていることに注意してください。

期待される出力。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                                     PORTS               NAMES

1e83c476c2ee        tutorial:demo       "/bin/sh -c 'while t�"   1 second ago        Up Less than a second (health: starting)                       tutorial
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                                     PORTS               NAMES

1e83c476c2ee        tutorial:demo       "/bin/sh -c 'while t�"   2 seconds ago       Up Less than a second (health: starting)                       tutorial
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES

1e83c476c2ee        tutorial:demo       "/bin/sh -c 'while t�"   2 seconds ago       Up 1 second (unhealthy)                       tutorial
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES

1e83c476c2ee        tutorial:demo       "/bin/sh -c 'while t�"   3 seconds ago       Up 1 second (unhealthy)                       tutorial

0.8秒の間、健康状態は(ヘルス:開始)です。

1秒後にステータスが(異常)に変わります。

実際のprod環境に合わせてこれらの設定をいじるのは管理者であるあなた次第です。

--interval=DURATION (default: 30s)
--timeout=DURATION (default: 30s)
--start-period=DURATION (default: 0s)
--retries=N (default: 3)

管理者としても、適切なヘルスチェックコマンドを prod env で決定しなければなりません。Webサーバコンテナ、データベースコンテナ、ハプロキシコンテナは、すべて異なるヘルスチェックの要件を持っています。

ここでは、状態がどのように変化するかを素早く表示するために使用しています。

健康状態がどのように見えるかを確認するために、成功するヘルスチェックのサンプルを実行してみましょう。

これをDockerfileに追加するには

nano Dockerfile

FROM alpine:3.8
HEALTHCHECK --interval=.1s --timeout=.4s  --retries=1\
  CMD sleep .1 || exit 1

を使用して画像を構築します。

docker build --tag tutorial:demo --file Dockerfile  .

コンテナを起動して結果を見てみましょう。

docker stop -t 0 tutorial ;   docker container prune -f  
docker run -ti -d --name tutorial tutorial:demo /bin/sh -c 'while true; do sleep 60; done';docker ps -a; sleep .4; docker ps -a; sleep .4; docker ps -a; sleep .4; docker ps -a; sleep .4;

期待される出力。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                                     PORTS               NAMES

c83552f66511        tutorial:demo       "/bin/sh -c 'while t�"   1 second ago        Up Less than a second (health: starting)                       tutorial
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS               NAMES

c83552f66511        tutorial:demo       "/bin/sh -c 'while t�"   2 seconds ago       Up Less than a second (healthy)                       tutorial
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS               NAMES

c83552f66511        tutorial:demo       "/bin/sh -c 'while t�"   2 seconds ago       Up 1 second (healthy)                       tutorial
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES

c83552f66511        tutorial:demo       "/bin/sh -c 'while t�"   3 seconds ago       Up 2 seconds (healthy)                       tutorial

sleep .1 は 10 分の 1 秒間正常にスリープし、その後ステータスのリターンコードを返します。

残念ながら、docker ps -a コマンドのステータスフィルタは健康状態によるコンテナのマッチングを行いません。フィルタリングできるのは、created, restarting, running, removing, paused, exited, dead のみです。

実行できません: docker ps --filter status=healthy

実行できません: docker ps --filter status=unhealthy

以下の
docker ps -a | grep '(healthy)'
そして
docker ps -a | grep '(unhealthy)'
を使う必要があります。

Dockerfile EXPOSE Ports

このセクションでは、Dockerfile が EXPOSE を使ってコンテナのポートを公開する方法を学びます。

コンテナは孤立した実行プロセスです。コンテナは、他のコンテナがアクセスできるポートを明示的に指定しなければなりません。

ポートとは、プロセスが他のプロセスに連絡してコマンドを送信するための公式な方法です。

例えば、Apache のポート 80 は通常公開されています。Apache はコンテナの中に隔離されて隠れています。何かをさせる唯一の方法は、ポート 80 を通してアクセスすることです。

EXPOSE 命令はコンテナが listen するポートを宣言します。

ポートがTCPかUDPかを指定することができます。プロトコルが指定されていなければデフォルトはTCPです。

EXPOSE 命令は実際にポートを公開しません。

EXPOSE はドキュメントとしての役割を果たすだけです。これは、コンテナ内のどのポートが公開可能な状態にすることを意図しているかを宣言します。

https://docs.docker.com/engine/reference/builder/#expose より

コンテナの実行時に実際にポートを公開するには、docker run で -p フラグを使用して 1 つ以上のポートを公開してマッピングするか、-p フラグを使用してすべての公開されたポートを公開して高次ポートにマッピングします。

デフォルトでは、expose は TCP を想定しています。UDP を指定することもできます。

EXPOSE 80/tcp

EXPOSE 80/UDP

このチュートリアルでは、ポート80、tcpとudpを公開します。

Dockerfileを以下のように編集します。

nano Dockerfile

FROM alpine:3.8
EXPOSE 80/tcp
EXPOSE 80/udp

を使用して画像を構築します。

docker build --tag tutorial:demo --file Dockerfile  .

コンテナを起動して結果を見てみましょう。

docker run -ti -d --name tutorial tutorial:demo /bin/sh -c 'while true; do sleep 60; done'

期待される出力

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                                     PORTS               NAMES

6269a988e1dd        tutorial:demo       "/bin/sh -c 'while t�"   1 second ago        Up Less than a second (health: starting)   80/tcp, 80/udp      tutorial

ports カラムには、公開されているポートが表示されていますが、使用できません。それらを公開しなければなりません。docker runコマンドの-p 30000:80/tcpを使って公開します。

-p 30000:80/tcp

30000 はホストのポート番号を指定します。80/tcpはコンテナのポート番号を指定します。

コンテナを作成して結果を見てみましょう。

docker stop -t 0 tutorial; ;   docker container prune -f  

docker run  -p 30000:80/tcp  -ti -d --name tutorial tutorial:demo /bin/sh -c '\''while true; do sleep 60; done'\'''

期待される出力。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS               NAMES

8b3e43916708        tutorial:demo       "/bin/sh -c 'while t�"   1 second ago        Up Less than a second   0.0.0.0:30000->80/tcp, 80/udp      tutorial

0.0.0.0.0:30000->80/tcp

localhost のポート 30000 はコンテナのポート 80 にマップされています。

これでホスト上でポート30000が開いていることが確認できます。

ss コマンドはソケットに関する情報を表示するために使用されます。ss コマンドはソケットの情報を表示するために使用します。( netstatコマンドはCentOSのデフォルトインストールでは存在しなくなりました。代わりに service コマンドを使用します。)

ss -t -a -n

オプションの短いバージョン、長いバージョン。

1、-t, --tcp は TCP ソケットのみを表示します。
2、-a, --all すべてのソケットを表示します。
3、-n, --numeric はサービス名を解決しないので、ポート番号を数値で表示します。

期待される出力

State       Recv-Q Send-Q Local Address:Port                Peer Address:Port
LISTEN      0      128                *:22                             *:*
ESTAB       0      0      192.168.56.44:22                 192.168.56.11:4118
ESTAB       0      64     192.168.56.44:22                 192.168.56.11:2719
LISTEN      0      128               :::30000                         :::*
LISTEN      0      128               :::22                            :::*

30000番ポートがホストでリッスンされていることがわかります。

30000には特別な意味はありません。ここでは簡単に見つけられるポート番号として使われているだけです。

同様に udp 80 番ポートも公開してみましょう。実行してみてください。

docker stop -t 0 tutorial; ;   docker container prune -f  
docker run -p 40080:80/udp 30000:80/tcp -

パブリッシュがうまくいったかどうかを確認します。

ss -u -a -n

期待される出力

State       Recv-Q Send-Q Local Address:Port                Peer Address:Port
UNCONN      0      0                 :::40080                         :::*

今回は -u 引数を使って udp ポートを表示していることに気がつきました。

Dockerfile の ENV 変数

環境変数を使用して、実行中のコンテナに値を送ることができます。

環境変数はコンテナが動作する環境の一部です。
構文は以下の通りです。

構文:
ENV

ENV =

ENV 命令は、環境変数に値を設定します。

例えば

ENV myVar1=1
ENV myVar42=42
ENV myAlfaVar=alfa value abc

私たちの小さなAlpine Linuxディストロを使って、env内のenv変数を見てみましょう。

この内容でDockerfileを作成します。

FROM alpine:3.8
ENV myVar1 1
ENV my42 42
ENV myVar42=42
ENV myAlfaVar='alfa abc'

env変数の宣言には2種類の方法を使っていることに注意してください。

画像をビルドするには

docker build --tag tutorial:demo --file Dockerfile  .

実行:

docker stop -t 0 tutorial ;   docker container prune -f  
docker run -ti -d --name tutorial tutorial:demo /bin/sh -c 'while true; do sleep 60; done'

docker exec -it tutorial /bin/sh

#(プロンプト)でprintenvコマンドを入力します。

期待される出力

/ # printenv
HOSTNAME=1314796592cf
SHLVL=1
HOME=/root
my42=42
TERM=xterm
myVar1=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
myAlfaVar=alfa abc
myVar42=42
PWD=/
/ # exit

宣言したenv変数はすべてそこにあります。

docker runを使うときにenv変数をオーバーライドすることができます。

実行:

docker stop -t 0 tutorial ;   docker container prune -f  

docker run -e  'my42=44000' -ti -d --name tutorial tutorial:demo /bin/sh -c 'while true; do sleep 60; done'

今コンテナに入るとmy42が44000になっているのがわかります。

docker exec -it tutorial /bin/sh

期待される出力

/ # printenv
HOSTNAME=1190753a779e
SHLVL=1
HOME=/root
my42=44000
TERM=xterm
myVar1=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
myAlfaVar=alfa abc
myVar42=42
PWD=/

これで、DockerfileでENV変数を宣言したり、docker run -e 'my-env-var-name=new value'を使ってENV変数をオーバーライドしたりする実践的な経験ができるようになりました。

また、printenv を使って env 変数の内容を調べることもできます。(シェルプロンプトで env 変数を表示するには set や env を使うこともできます)

詳細は https://en.wikipedia.org/wiki/Environment_variable

https://docs.docker.com/engine/reference/builder/#env

https://docs.docker.com/engine/reference/builder/#environment-replacement

これで4のパート2は終了です: すべてのDockerfileのインストラクションを知ることができます。もっと詳しく知りたい方は、パート3を読んでください。

アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

特定のフォルダに生成される一時ファイルの一括削除コマンド作成

非経験的分子軌道ソフト「Gamess」などでは任意のフォルダに「〜.dat」や「〜.F05」という謎の一時ファイルが生成し、Gamessでの計算が終了しても消えません。(無論、エラー終了でも消えません。)
と、いうことでこれらを一括削除できるコマンドとして「alias」コマンドを採用しました。

aliasコマンドとは、簡単にいうと自分の好きな文字列を使って、自分のよく使うコマンドや操作をターミナルに登録でき、どのディレクトリからでもそのコマンドを実行できるというものです。

では設定しましょう。

Gamessの一時ファイルは以下の場所に生成されるとします。
ユーザー名は「Qiita」にしましょう

/home/Qiita/gamess/tmp

このフォルダ内に生成されたファイルは、あるコマンドを打ったときには無条件に消したい。
ここでは「delete」という文字列をターミナルで打ったら上記のフォルダ内のファイルを全削除するように設定します。

alias
alias delete='rm -rf /home/Qiita/gamess/tmp/*'
#alias (1) = '(2)'

(1)・・・登録する文字列
(2)・・・(1)を入力したときに実行するコマンド
上記例では、rm コマンドを delete という文字列と紐付けましたが、別のコマンドでももちろんできます。コマンドが連続しない操作ではこのaliasを活用しても良いと思いました。

また上記のaliasコマンドはログアウトと共に登録は解除されてしまうので、
~/.bashrc に登録しておくと良いと思います。

お読みいただきありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む