UbuntuにTomcatをインストールしたあとにTomcatユーザでSSHログインしたい

Linux

UbuntuにTomcat9をインストールしたら自動的にtomcatユーザを作成されますが、tomcatユーザでSSHログインできませんでした。
その時に対応したことをメモ。


まず、「/etc/passwd」を確認します。

root@zsh:~# cat /etc/passwd | grep tomcat
tomcat:x:1001:1001::/opt/tomcat:/bin/false

上記の「:/bin/false」部分を「:/bin/bash」に変更します。
これでtomcatユーザに対して「/bin/bash」が有効となり、SSHログインが可能になります。

root@zsh:~# cat /etc/passwd | grep tomcat
tomcat:x:1001:1001::/opt/tomcat:/bin/bash

Ubuntu22にPostgreSQL15をインストールする

Linux

Ubuntu22にPostgre15をインストールする方法について紹介します。
途中、少し手こずったので、対処方法についても紹介します。


環境


  • Ubuntu Server 22.03.3 LTS
  • PostgreSQL15.4
  • rootユーザ

PostgreSQLのバージョン確認


まず、Ubuntu22でのPostgreSQL標準バージョンを確認します。

apt info postgresql

以下のバージョンが標準バージョンとなります。

Package: postgresql
Version: 14+238

Ubuntu構築時点では認識できる標準バージョンが古い場合があるので、レポジトリを追加して、再度、PostgreSQL標準バージョンを確認します。

apt install curl ca-certificates gnupg 
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/apt.postgresql.org.gpg >/dev/null
sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
cat /etc/apt/sources.list.d/pgdg.list 
↓レポジトリが追加されていることを確認
deb http://apt.postgresql.org/pub/repos/apt jammy-pgdg main
↑レポジトリが追加されていることを確認

apt update
apt info postgresql
↓標準バージョンが変化していることを確認
Package: postgresql
Version: 15+253.pgdg22.04+1
↑標準バージョンが変化していることを確認

 


PostgreSQLをインストール


とりあえず、aptコマンドを使用してPostgreSQLをインストールしてみます。


apt install -y postgresql

以下のメッセージが表示されてエラーとなります。

E: Failed to fetch http://apt.postgresql.org/pub/repos/apt/pool/main/p/postgresql-15/postgresql-15_15.4-1.pgdg22.04%2b1_amd64.deb  Connection failed [IP: 87.238.57.227 80]		
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?		

“apt-get update”をやってみろと言われているので、素直にやってみます。
依存関係の更新ですね。

apt-get update
apt-get install
apt install -y postgresql

しかし、同じエラーとなってしまいました。

E: Failed to fetch http://apt.postgresql.org/pub/repos/apt/pool/main/p/postgresql-15/postgresql-15_15.4-1.pgdg22.04%2b1_amd64.deb  Connection failed [IP: 147.75.85.69 80]	
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?	

パッケージを手動ダウンロードして再インストール


パッケージのダウンロードでエラーとなっているようなので、手動でダウンロードしてみます。
手動でフォルダを作成し、そのフォルダにダウンロードします。

mkdir -p /tmp/
cd /tmp/
wget http://apt.postgresql.org/pub/repos/apt/pool/main/p/postgresql-15/postgresql-15_15.4-1.pgdg22.04%2b1_amd64.deb
ls -ltr
↓パッケージがダウンロードされていることを確認
postgresql-15_15.4-1.pgdg22.04+1_amd64.deb
↑パッケージがダウンロードされていることを確認

ダウンロードできたかことが確認できたら、ダウンロードしたパッケージのみをインストールします。


dpkg -i ./postgresql-15_15.4-1.pgdg22.04+1_amd64.deb

再度、インストールを実施してみます。

apt install -y postgresql

以下のエラーになってしまいます。

E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).

“–fix-broken”オプションを付けて依存関係を更新しろといわれているのでやってみます。

apt --fix-broken install

再度インストールをやってみます。

apt install -y postgresql

正常にインストールが終了したら、「systemctl」で起動していることを確認して終了です。

root@zst:~# systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor pres
     Active: active (exited) since Sun 2023-09-03 11:07:21 UTC; 7s ago
    Process: 68255 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 68255 (code=exited, status=0/SUCCESS)
        CPU: 3ms
Sep 03 11:07:21 zst systemd[1]: Starting PostgreSQL RDBMS...
Sep 03 11:07:21 zst systemd[1]: Finished PostgreSQL RDBMS.


シェルで簡単なCUIを作成する方法

Linux

こんにちは。
さくさくTECHブロガーの「さく」です。


よくシェルを使ったバッチなどの一括処理を実行したりしますが、シェルで簡単なCUIを作成することもできます。
今回は、実際にサンプルシェルプログラムを作成してみます。


■標準入力を受け取る”read”コマンド


標準入力を受け取るには、readコマンドを使用します。
以下の例では、-pオプションを使用して、入力文字列の前に選択肢の文字列を表示しています。


read -p "削除するフォルダを選択して下さい。[ 'A' or 'B' or 'C']." input

function化して部品化


決められた文字の入力のみを想定している場合、イレギュラーな文字を入力された場合の制御は意外と厄介です。
function化することで、シェルプログラムの煩雑化を防ぐことができます。


function select_delete() {
  read -p "削除するフォルダを選択して下さい。[ 'A' or 'B' or 'C']." input

  if [ -z $input ] ; then
    select_delete               # ←何も入力されなかった場合は再び"select_delete()"を呼び出す
  elif [ $input = 'A' ] ; then
    return 1
  elif [ $input = 'B' ] ; then
    return 2
  elif [ $input = 'C' ] ; then
    return 3
  else
    select_delete               # ←A・B・C以外が入力された場合は再び"select_delete()"を呼び出す
  fi
}
select_delete                   # ←通常の呼び出しパターン"select_delete()"を呼び出す

 


処理と組み合わせる

[display_update_date]


サンプルシェルプログラムを作ってみました。
削除したいフォルダが「A」「B」「C」の3つ存在するとした場合、どれを消すかを選択してもらえれば、選択したフォルダを削除するシェルプログラムになります。


このサンプルはわざわざシェル化する必要ないようなものですが、いろいろな用途で使えるテクニックかと思います。


#!/bin/bash

function select_delete() {
  read -p "削除するフォルダを選択して下さい。[ 'A' or 'B' or 'C']." input

  if [ -z $input ] ; then
    select_delete
  elif [ $input = 'A' ] ; then
    return 1
  elif [ $input = 'B' ] ; then
    return 2
  elif [ $input = 'C' ] ; then
    return 3
  else
    select_delete
  fi
}
select_delete
mode=$?

if [ ${mode} =  1 ]; then
   rm -fr A
elif [ ${mode} =  2 ]; then
   rm -fr B
elif [ ${mode} =  3 ]; then
   rm -fr C
else
   exit 0
fi

バッチ処理の二重起動チェックをシェルだけで実現する方法

Linux

Linux系のОSでバッチを起動する場合は、シェルを作成して、シェルからJavaなどのプログラムを呼び出すケースが多いかと思います。


バッチで問題になるのが「バッチの重複起動」になります。
“バッチ突き抜け”とも言いますが、1つのバッチが終了する前に同じバッチが起動してしまうと二重起動の状態になってしまい、思わぬ不具合が発生してしまいます。
この場合、プログラム側で重複起動をおこなわないような制御をおこなう必要があります。


今回は、このバッチ重複起動チェックをシェルだけで実現する方法を紹介します。

シェルだけで実現する方法なので非常にシンプルですが、確実に二重起動チェックを防ぐことができます。


環境情報


  • OS:CentOS 7.6

pgrepコマンドとは


重複起動チェックで使用するコマンドは「pgrep」コマンドです。
「pgrep」コマンドは、プロセスが保持しているプロセス名属性からプロセスIDを取得するコマンド
になります。


要は「pgrep」コマンドは、「ps」コマンドと「grep」を合体したコマンドですね。
psコマンドの出力結果をパイプ(|)で繋いでgrepで抽出することが多いかと思いますが、この操作を同時に実行することが「pgrep」コマンドになります。


基本的な文法は以下になります。

pgrep [オプション] [プロセスの特定パターン]

二重起動チェックのシェルプログラム


二重起動チェックのシェルプログラムは以下になります。
「pgrep」コマンドで自身のプロセス名のプロセス番号を取得し、そのプロセス番号と自身のプロセス番号と比較しています。
プロセス番号の比較結果が異なる場合は、自身のプロセスと同名の他プロセスが動作していると判断する、ということですね。


#!/bin/sh

echo "start"
PGREP=`pgrep -f $0 -o`
PGREP_RSLT=$?

if [ $$ != $PGREP  ];
then
  echo "$0は起動中です。二重起動チェックです。"
  exit 1
fi

sleep 180
echo "end"

上記サンプルプログラムを同時に実行すると、一方のシェルはチェックに掛かって起動できません。
二重起動チェックにかかりやすいように、180秒のスリープをおこないバッチ実行中の時間を長くとっています。


pgrepコマンドのオプションと特定パターン


二重起動チェックで使用している「pgrep」コマンドのオプションや、使用している特殊変数について説明していきます。


まずは「pgrep」コマンドのオプションです。
二重起動チェックで使用しているのは「-f」オプションと「-o」オプションになります。


「-f」「-o」オプション含めて、よく使用するオプションを紹介しておきます。


オプション フルオプション 説明

-f

–full

コマンドライン全体をパターンマッチの対象とする。

-o

–oldest

対象のプロセスから最も昔に起動されたものだけを対象とする。

-n

–newest

対象のプロセスから最も最近に起動されたものだけを対象とする。

-U ユーザ

–uid ユーザ

指定したユーザのプロセスを対象とする。「,」区切りで複数指定可能。

-v

–inverse

検索パターンの否定。


次に特殊変数についてです。


  • $0:実行中プロセスのシェルファイル名。
  • $?:直前に実行したコマンドの実行結果。成功時は「0」。失敗時は「0」以外。
  • $$:実行中プロセスのプロセスID。

この特殊変数は非常に便利です。
実際の動きを紹介していきます。


$0特殊変数。実行中プロセスのファイル名。


実行中プロセスのシェルファイル名は「test.sh」となります。
そのファイル名がそのまま特殊変数として格納されています。


#!/bin/sh

echo "start"
echo $0
echo "end"

test.sh

$?特殊変数。コマンド実行結果。


コマンドの実行結果が格納されています。
厳密にはコマンドの実行結果を参照して、二重起動チェックに成功したか?失敗したか?についても処理分岐が必要となります。


#!/bin/sh

echo "start"
PGREP=`pgrep -f $0 -o`
echo $?
echo "end"

0

$$特殊変数。実行中プロセスのプロセスID。


実行中プロセスのプロセスIDが格納されています。


#!/bin/sh

echo "start"
echo $$
echo "end"

4269


Linuxでサーバ容量・フォルダサイズ・ファイルサイズを調べるコマンド

Linux

Linuxサーバ上で、サーバ全体のディスク使用率や、フォルダサイズ・ファイルサイズを調査する時に便利なコマンドについて紹介していきます。


サーバ容量を確認する(dfコマンド)


サーバ全体の容量について確認する際に使用するのはdfコマンドになります。


[@users]$ df
ファイルシス   1K-ブロック     使用    使用可 使用% マウント位置
devtmpfs           3981472        0   3981472    0% /dev
tmpfs              3999296      260   3999036    1% /dev/shm
/dev/sda1           613184     6908    606276    2% /boot/efi

オプションには、以下があります。


-a

すべてのディスクを表示。

隠しファイルシステムなど、全てのディスクを表示します。

-H

単位を付けて結果を表示。

容量の表示は数字が大きくなってしまうので、k(キロ)、M(メガ)、G(ギガ)の単位を付けて表示するのが一般的です。


フォルダサイズを確認する(duコマンド)


フォルダのサイズを確認する時はduコマンドを使用します。


[@users]$ du
28      ./numberAnalyze/module
1088    ./numberAnalyze/logs
1124    ./numberAnalyze
16      ./winningAnalyze/module
916     ./winningAnalyze/logs
940     ./winningAnalyze
16      ./winningExpected/module
26044   ./winningExpected/logs
26068   ./winningExpected
12      ./winningCollection/module/__pycache__
24      ./winningCollection/module
12      ./winningCollection/logs
44      ./winningCollection
28184   .

duコマンドではフォルダサイズだけではなく、ファイルサイズも確認することができます。
以下のコマンドでは、コマンドを発行しているフォルダ直下ファイルのファイルサイズも表示します。


[users]$ du ./*
4       ./loto.sh                       ★
28      ./numberAnalyze/module
1088    ./numberAnalyze/logs
1124    ./numberAnalyze
16      ./winningAnalyze/module
916     ./winningAnalyze/logs
940     ./winningAnalyze
12      ./winningCollection/module/__pycache__
24      ./winningCollection/module
12      ./winningCollection/logs
44      ./winningCollection
16      ./winningExpected/module
26044   ./winningExpected/logs
26068   ./winningExpected

★=直下のファイル


以下のコマンドでは、もう1階層下フォルダのファイルサイズを表示します。


[users]$ du ./*/*
1088    ./numberAnalyze/logs
28      ./numberAnalyze/module
4       ./numberAnalyze/numberAnalyze.sh         ★
916     ./winningAnalyze/logs
16      ./winningAnalyze/module
4       ./winningAnalyze/winningAnalyze.sh       ★
12      ./winningCollection/logs
12      ./winningCollection/module/__pycache__
24      ./winningCollection/module
4       ./winningCollection/winningCollection.sh ★
26044   ./winningExpected/logs
16      ./winningExpected/module
4       ./winningExpected/winningExpected.sh     ★

★=1階層下のファイル


指定した階層のフォルダサイズを確認したい場合は「–max-depth」オプションを使用します。
以下のコマンドでは、コマンドを実行したフォルダ直下について、フォルダ毎のサイズを表示しています。


[users]$ du --max-depth=1
1124    ./numberAnalyze
940     ./winningAnalyze
26068   ./winningExpected
44      ./winningCollection
28184   .

サイズを調べるフォルダを深くしたいきたい場合は、「–max-depth」オプションの数字を大きくしていけばよいです。

数字が大きいほど、下の階層まで検索対象となります。

[users]$ du --max-depth=2
28      ./numberAnalyze/module
1088    ./numberAnalyze/logs
1124    ./numberAnalyze
16      ./winningAnalyze/module
916     ./winningAnalyze/logs
940     ./winningAnalyze
16      ./winningExpected/module
26044   ./winningExpected/logs
26068   ./winningExpected
24      ./winningCollection/module
12      ./winningCollection/logs
44      ./winningCollection
28184   .

上記以外のよく使うオプションも紹介しておきます。


-h

読みやすい単位で表示する。

-H

読みやすい単位で表示する。

ただし、1024単位ではなく1000単位の値を使用。

-c

合計のサイズも表示

-k

キロ単位で表示

-m

メガ単位で表示



MySQLのDBコネクション関連でトラブルが発生した際にやること

Linux

稼働中のシステムにおいて発生するトラブルのひとつに、MySQLのコネクションに関するトラブルがあります。
“アプリケーションからDBコネクションを取得できない!””想定以上にアプリケーションがコネクションを取得している”といったとトラブルになります。


今回は、MySQLのコネクションに関するトラブルが発生した場合に調査するポイントと、調査のために実行するコマンドについて紹介していきます。


現在のコネクション数を確認


MySQLに、現在接続しているコネクション数を確認するには、show status コマンドを実行します。
MySQLにログインしてコマンドを実行します。


mysql> show status like 'Threads_connected';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 29    |
+-------------------+-------+
1 row in set (0.00 sec)

上記コマンドで現在接続されているコネクション数を確認して、MySQLで許可している最大コネクション数を超えていないかの確認が可能です。


最大コネクション数を確認


MySQLが許可している最大コネクション数を確認します。
このコネクション数が接続される可能性がある数を超えてしまうので、MySQLに接続できない状態になってしまいます。


mysql> SHOW GLOBAL VARIABLES like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 512   |
+-----------------+-------+
1 row in set (0.01 sec)

接続元のIPを確認


現在のプロセスを一覧で表示して、発生しているコネクションが、どのサーバから接続されているかの確認も可能です。


mysql> SHOW processlist;
+------------+------------+------------------------------+
| Id | User | Host | db | Command | Time | State | Info  |
+------------+------------+---------------------+--------+
  ・
  ・
  ・

Hostカラムが接続元サーバのIPとPORTです。


MySQLを起動してからの最大接続数を確認


MySQLを起動してから接続された最大コネクション数も確認することができます。

トラブルが発生しても、調査を開始したタイミングではコネクション数は問題ない場合があります。

しかし、トラブル発生直後はコネクション数が規定値をオーバーしている可能性があるので、このコマンドを実行して過去の最大コネクション数を確認するとよいです。


mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| Max_used_connections | 513   |
+----------------------+-------+
1 row in set (0.00 sec)

DBサーバのKeepAliveを確認


TomcatなどのWEBアプリケーションがコネクションプールを取得している状態で、Tomcatが起動しているサーバが落ちてしまうと、MySQLのコネクションは残ってしまいます。
このコネクションは不要なコネクションとなるのですが、一定時間が過ぎると自動的にコネクションは解放されます。


この「一定時間」は、MySQLがインストールされているサーバのKeepAliveパケット送信の設定に依存します。

システム設定値となり、以下のコマンドで格納可能です。


以下の設定例では、60秒で不要なコネクションは解放されます。


$>sysctl -a
 ・
 ・
 ・
net.ipv4.tcp_keepalive_intvl=5
net.ipv4.tcp_keepalive_probes=6
net.ipv4.tcp_keepalive_time=30
 ・
 ・
 ・

30秒間隔でKeepAliveパケットを6回送信する。
その6回は5秒間隔、という設定になります。


各項目の説明を一応記載しておきます。


net.ipv4.tcp_keepalive_intvl

KeepAliveパケットを送信する間隔

net.ipv4.tcp_keepalive_probes

KeepAliveパケットを送信する回数

net.ipv4.tcp_keepalive_time

KeepAliveパケットを送信するまでの時間


現場で使えるtailコマンド。ログ監視で必要なオプションなど。

Linux

運用・保守の業務をおこなっている人にとっては、とても馴染みがあるコマンドのtailコマンドについてまとめてみます。


筆者が一番使うタイミングは、やっぱりログ監視です。

tailは「尻尾」「末尾」の略ですが、tailコマンドを使えばファイルの終端を常に表示するので、稼働中システムのログを監視する際にとても便利です。


基本動作


tail ※ファイル名 で、ファイルの末尾を表示することができます。


$ tail file1.txt
テスト8
テスト9
テスト10

追記を監視(ラージFとスモールf)


基本動作の tail ※ファイル名 だけでは、ファイルが追記されいったとしてもコマンド上に追記内容が表示されません。


しかしこれだと、例えばアプリケーションのログ監視をおこなう場合に不便です。
アプリケーションがログに追記するたびに表示内容を更新する(常に末尾表示)ためには、-f オプションを使用します。


$ tail -f file1.txt
テスト8
テスト9
テスト10
$ tail -f file1.txt
テスト9
テスト10
テスト11 ← 追記されている。

上記は-f(スモールf)を使っていますが、ログ監視のことを考えると不便な事があります。
それはログのローテーションです。


指定しているファイルがリネームされて新しいファイル名となり、指定しているファイルが新規ファイルとなった場合、-f(スモールf)では末尾監視がおこなわれません。


tailコマンドで監視できない

ログローテーションのように、監視対象のファイルが新しく作成された場合も監視した場合は、-f(スモールf)ではなく-F(ラージF)を使います。
-F(ラージF)を使う事で、ファイル名が変わって監視対象ファイルが新規作成されたとしても、対象ファイルは監視が継続されます。


$ tail -F file1.txt
tail: `file1.txt' has become inaccessible: No such file or directory
tail: `file1.txt' has appeared;  following end of new file
tail: file1.txt: file truncated
ファイル1
ファイル2
ファイル3

行数を指定する(-n)


末尾の表示する行数を指定示することも可能です。


$ tail -n3 file1.txt
ファイル9
ファイル10
ファイル11

-fオプションを指定して、末尾N行を監視する、といったことも可能です。


$ tail -3f file1.txt
ファイル9
ファイル10
ファイル11

パイプで繋げてgrepで抽出


特にtailコマンドのオプションではないのですが、大量にログを出力するアプリケーションであれば、-fオプションを指定していてログを監視していてもログが流れるのが早くて目で追えないです。

その場合は、監視しておきたいキーワードを事前に決めておき、パイプ(|)で繋いでgrepコマンドで抽出するようにしておきます。


$ tail -f file1.txt | grep ※キーワード
ファイル12

上記のようにパイプで繋いでgrepを指定することで、grepで指定したキーワードが出現した時だけ表示してくれます。

とても効率的なログ監視をおこなうことができます。


まとめ


現場のエンジニアにとって、tailコマンドは必須のコマンドかと思います。
上手に使いこなして、日々の作業に役立ててください。




シェルで外部ファイルを読み込む。サンプルシェルで解説。

Linux

今回は、シェルで外部ファイルを読み込む方法を紹介します。


シェルファイルは、非常に強力なスクリプトです。
使い方によっては、ちょっとした機能は実現することができます。


外部ファイルの読み込みパターン


外部ファイルを読み込むパターンとして、以下の2パターンについて説明します。


  • 外出し定義ファイルの読み込み
  • シェルからシェルを呼び出す

外出し定義ファイルの読み込み


シェルでちょっとした機能を実現する際に、さまざまなパラメータを外部ファイルに定義することが必要になる場合があります。
ファイル読み込み・書き込み系のシェルであればファイルパスを外部ファイルに定義したり、ですね。

そういった外部ファイル定義についてもシェルで可能です。


外部ファイル読み込みのサンプルシェル


サンプルシェルは以下になります。

#!/bin/sh
# 
# 外部ファイルの読み込み
# 

    echo "start."
    while read line
    do
        KEY=`eval echo $line | awk '{print $1}'`
        VAL=`eval echo $line | awk '{print $2}'`
        echo $KEY
        echo $VAL
    done < setting.config
    echo "end."

外部ファイルとなる「setting.config」は以下です。

line1    value1
line2    value2
line3    value3

実行結果は以下になります。

$ sh configLoad.sh
start.
line1
value1
line2
value2
line3
value3
end.

行データを繰り返し読み込む


行データを読み込む方法は以下になります。


while文で、自動的に最終行まで外部ファイルの読み込みをおこなっていきます。
読み込み対象ファイルをdone部分に記載することで、対象ファイルの読み込むをおこないます。


上記サンプルプログラムは、シェルファイルと同フォルダに、外部ファイルとなる「setting.config」が存在する状態のシェルファイルとなります。

    while read line
    do
        ・・・制御・・・
    done < 設定ファイルパス

lineに1行データが格納されるので、”・・・制御・・・”の部分にlineに対する処理を記載することになります。


awk(オーク)コマンドで列ごとに読み込み


awk(オーク)コマンドは、文字列を抽出するコマンドになります。
{print $N}で、N番目の列を抽出することができます。


上記のサンプルプログラムは、2列の行データなので、{print $2}までしかないですが、列をもっと増やしていきたい場合は、{print $3}といった具合に列の数を増やしていけば、対象の列データを読み込むことができます。


シェルからシェルを呼び出す


共通機能を定義したシェルを準備した場合、そのシェルを他のシェルから呼び出したい場合があります。

つまり、シェルからシェルを呼び出す、ということですね。


シェルからシェルを呼び出すサンプル


サンプルシェルは以下になります。

呼び出すシェルと呼び出されるシェルの2つになります。


呼び出す側のシェル

#!/bin/bash

`./sub.sh`
RET=$?
echo $RET

呼び出される側のシェル

#!/bin/sh
exit 10

シェルを呼び出す


シェルを呼び出す場合の記載は簡単です。

シェルのパスを「`」で囲めば呼び出すことができます。


`./sub.sh`

シェルから返り値を受け取る


シェルから返り値を受け取る場合は、呼び出される側は「$?」で取得できます。


RET=$?

呼び出される側は、「exit」を用いて返り値を返却できます。


exit 10



VMWarePlayer上にCentOSをインストールして動かしてみる

Linux

今回は、VMWare上にCentOSをインストールして動かす方法を紹介します。


Linuxに限らず、普段はWindowsを使って作業している人が、他のOS環境も必要な場合があるかと思います。
そういう場合は、VMWareを使う方法が最も簡単です。

Windows上に仮想のHDを割り当てて、別OSの環境を構築できます。


しかも、別サーバに環境を移植したい場合は、VMWareのファイル一式をコピーすれば、簡単に引っ越しも可能です。


今回は、Winodows10上にVMWareをインストールして、CentOSを構築する方法を紹介します。


環境情報


  • ホストマシン:Windows10
  • VMWare:15.5.2 build-15785246
  • CentOS: release 8.1.1911

VMWareをダウンロードしてインストール


以下のURLからダウンロードします。



インストーラを起動すると、いきなり以下のポップアップウィンドウが表示されます。
どうやら、「Microsoft VC」をインストールする必要がありそうです。
とりあえず、ホストとなるインストール端末を再起動します。


VCのインストール

※筆者の場合は自動的にインストールされたようで、再起動してインストールを再開したら再度ダイアログが表示されることはなかったです。


インストール端末を再起動したら、再度インストーラを起動します。
インストールは、画面のウィザードに沿ってインストールしていけば大丈夫です。

最終的に以下のダイアログが表示されればインストール完了です。


VMWareのインストール完了

CentOSをダウンロードしてインストール


CentOSは、以下のURLからダウンロードします。


isoredirect.centos.org
CentOS
http://isoredirect.centos.org/centos/8/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso
In order to conserve the limited bandwidth available, ISO images are not downloadable from mirror.centos.org

ミラーリングサイトを選択し、ISOファイルをダウンロードします。
7GBなので、結構時間がかかります
筆者は5Hくらいかかりました。


VMWare上にインストールするための準備として、まずはCentOSのISOファイルをマウントします。



マウントするとISOファイルがドライブとして認識されます。



この状態でVMWareを起動します。
VMWareが起動したら、「新規マシンの作成」を選択します。



「インストーラディスク」にマウントしたCentOSのドライブを選択し、「次へ」を押下します。



Linuxの情報を入力します。

ここでの「パスワード」は、rootユーザのパスワードになるので忘れないようにしましょう。



次に仮想マシンの名前を入力します。
自分で解りやすい名前をつければいいです。


CentOSのマシン名設定

次にディスク容量の指定をおこないます。
仮想マシンに割り当てる最大のディスクサイズになります。
筆者は、とりあえずデフォルトの20GByteにしました。



最後に確認画面が表示されます。
一応さらっと確認して、「完了」ボタンを押下します。


完了ボタンを押下したらインストールが開始します。
いきなり以下の確認ダイアログが表示されます。



ひとまず必要なさそうなので、「後で通知する」を選択してスキップします。


「Pane is dead」が表示されて画面が固まる


インストールを開始したと思ったら、何かVMWareのウィンドウが固まっているように見えます。
下の方には「Pane is dead」と表示されています。
日本語では、”画面(ペーン)が死んでいます”ですかね。。。


Pane is deadの表示

原因がよくわからないので、とりあえずもう1回同じ事をしてインストールしてみます。
しかし、それでも同じでした。。。


いろいろ調べたのですが、筆者の場合は以下の方法で回避できました。
とりあえず、VMWareで空のハードディスクを作ります



その後にインストールすると、ひとまずインストールが無事に完了しました。


以下に、空のハードディスクを作ってインストールする方法を紹介します。


空のハードディスクを作ってインストールを継続


インストールが進むと、インストールで使用する言語の選択ウィンドウが表示されます。
日本語を選択します。


CentOSの言語の選択

インストール概要ウィンドウが表示されるので、「インストールの開始」ボタンを押下します。



インストールが始まります。
空のハードディスクからインストールしたので、rootパスワードが設定されいないという表示になっています。
ひとまず、インストールが完了するのをまちます。


CentOSのインストール中

インストールは完了したのですが、設定に必要な項目が残っているので次に進めないです。
まずは、rootパスワードを設定します。


CentOSのrootパスワードの設定

rootのパスワードを設定したら、「設定完了」ボタンを押下します。


インストールが完了したら再起動ボタンを押下して、インストールを完了します。


CentOSの設定完了

再起動後の設定


再起動したら、初期セットアップウィンドウが表示されます。
まず、ライセンス情報を確認します。


CentOSのライセンス設定

「ライセンス契約に同意します」にチェックし、完了ボタンを押下したら完了です。

CentOSライセンスの同意

初期セットアップでの設定は完了です。
設定の完了ボタンを押下して、次に進みます。

最初にウェルカムウィンドウが表示されます。
「次へ」を押下します。

CentOSのインストール完了

位置情報サービスってやつがあるんですね。
これは必要なさそうなので、オフにして次へボタンを押下します。

CentOS位置情報の設定

オンラインアカウントへの接続も今回はおこまいません。
スキップします。

CentOSオンラインアカウント

ユーザ情報を入力します。

CentOSユーザ情報の入力

次にパスワードを入力します。
先ほど入力したユーザのパスワードになります。


これで完了です。
「CentOSを使い始める」を選択します。


先ほど作成したユーザが表示され、ログイン可能な状態になっています。
パスワードを入力して、ログインしてみます。


以下のようなウィンドウが表示されたインストール完了です。

おつかれさまでした。


CUIのウィンドウを開きたい場合は、「アクティビティ」→「端末」を選択します。





クーロン設定での小技集。設定の基本と、ちょっとしたテクニックを紹介

Linux

今回は、ちょっと特殊なクーロン設定を、まとめる形で紹介していきます
実際の業務でクーロンの設定をおこなう際、“あれ?あの設定でどうやるんだっけ?”というときに役立つTIPS集としてまとめます。


何か思いだしたら都度追記していきます。


クーロン設定の基本


まずは設定の基本を紹介します。
クーロン設定は以下の書式になります。

分  時  日  月  曜日 ユーザ名  コマンド

0分から59分までを定義

0時から23時までを定義

1日から31日までを定義

1月から12月までを定義。英字略形も可(jan,feb…dec)

曜日

0から7までを定義。0が日曜。英字略形も可(sun,mon…sat)


各定義について、リスト定義と範囲体後のどちらも可能です。

リスト

1,5,10

指定した値の場合のみ実行

範囲

1-5

指定した値の範囲内であれば実行

共存

1,5,10-15

リストと範囲の混在定義

間隔

1-5/2

「/」の後に間隔値を定義。左記の例だと「1,3,5」


月末に1回だけ動くクーロン設定


“月末に1回だけ動く”といったクーロン設定について紹介します。

結論を先に言いますと、以下の設定でOKです。


59 23 28-31 * * root   /usr/bin/test `date -d tomorrow +\%d` -eq 1 && sh /home/root/sample.sh

これで、”月末に1回だけ動く”というクーロン設定になります。

各設定の詳細について説明してきます。

前半部分が「月末」の定義です。

59 23 28-31 の部分ですね。


毎月、28日、29日、30日、31日の、23時59分にクーロンを動かせる設定になります。
でもこのままだと、月末に1回だけではなく、最大4回動いてしまいます。

なので、次の日が”1日”だったらという条件を追加します。
つまり、3月だと3月31日の次の日が1日(4月1日)だったら月末、
9月だと9月30日の次の日が1日(10月1日)だったら月末、という事ですね。


その計算が、/usr/bin/test `date -d tomorrow +\%d` -eq 1 &&  です。


testコマンドで条件を記述しています。
「date -d tomorrow +\%d」の返り値が1だったら月末と判定します。


この条件を28日から31日に動かすことによって、月末1回動作します。


標準出力をさせない設定


クーロンで実行したプログラムの実行結果が標準出力されることを防ぐためには、クーロン設定の末尾に標準出力を無しにする記述をおこないます。

55 23 28-31 * * root   /usr/bin/test `date -d tomorrow +\%d` -eq 1 && sh /home/root/sample.sh > /dev/null 2>&1

標準出力をなし(NULL)にします。
これで、標準出力はおこなわれません。