cron(crontab)の環境変数設定 メール送信先(MAILTO) PATH

CentOSにおいて、定期的にコマンドを実行するcronを使用する際、特に設定しない場合は、実行されたコマンドの出力が設定ユーザ宛にメールで送信される。

このコマンド実行結果の出力のメール送信先を変更したい場合はcrontabMAILTO環境変数をすればよい。

$ crontab -e
---------------------------------
MAILTO=user@example.com

*/5 * * * * /home/username/env.sh
---------------------------------

またcron実行環境(環境変数)は普通にユーザとしてログインした場合と違っているため、ログインして直接実行できてもcronを経由すると実行できないということがある。

例えば、cron実行環境では下記のような最低限のPATHが設定された状態のため、後からインストールした/usr/local/binにあるコマンドなど、PATHに含まれないコマンドはスクリプト内に記述しても実行できない。(もちろん、絶対PATHを指定したコマンドであれば実行される。)

PATH=/usr/bin:/bin

このように、cronでコマンドを実行できない理由がPATHにある場合はPATH環境変数をcrontabに設定すれば解決する。

$ crontab -e
---------------------------------
MAILTO=user@example.com
PATH=/usr/bin:/bin:/usr/local/bin

*/5 * * * * /home/username/env.sh
---------------------------------

ちなみに、実行するのがシェルスクリプトならばスクリプト内にPATHを書いても同様に解決する。スクリプト毎にPATHを書くのが面倒な場合はcrontabに書いてしまう方法がよいだろう。

タイムゾーンを日本標準時(JST)に変更する Rocky Linux 8, 9

クラウド環境のインスタンスなどでは、タイムゾーンがUTC(協定世界時)に設定されていて、ログを確認していても時間の感覚がつかめなかったり、ログ情報を読む際に日本時間と勘違いしてしまったりする可能性がある。

そのため、普段からJST(日本標準時)で運用してる場合は、ホストのタイムゾーンはJSTに統一しておいた方がよいだろう。

現在のタイムゾーンの設定を確認する

dateコマンドやtimedatectl statusサブコマンドで現在のタイムゾーンの設定を確認する。

$ date
Mon Jul 29 03:03:11 AM UTC 2024

$ timedatectl status
               Local time: Mon 2024-07-29 03:03:24 UTC
           Universal time: Mon 2024-07-29 03:03:24 UTC
                 RTC time: Mon 2024-07-29 03:03:23
                Time zone: UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

タイムゾーンをAsia/Tokyoに設定する

timedatectlコマンドでタイムゾーンをJST(Asia/Tokyo)に設定する。

$ sudo timedatectl set-timezone Asia/Tokyo

タイムゾーンの変更を確認する

再度タイムゾーンの設定を表示して、JST(Asia/Tokyo)に変更されているかを確認する。

$ date
Mon Jul 29 12:05:25 PM JST 2024

$ timedatectl status
               Local time: Mon 2024-07-29 12:05:29 JST
           Universal time: Mon 2024-07-29 03:05:29 UTC
                 RTC time: Mon 2024-07-29 03:05:28
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

設定可能なタイムゾーンを確認する

timedatectlコマンドで設定できるタイムゾーンはlist-timezonesサブコマンドで確認できる。

$ timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
… 以下略

タイムゾーン変更後について

ログに表示されるタイムスタンプにタイムゾーンを反映させるには各種サービスを再起動する必要がある。そのため、可能であればタイムゾーンの設定を変更した後にホスト自体を再起動することを推奨する。

すぐにホストの再起動をすることが難しい場合は、rsyslogと主要なサービスを再起動しておくと良いだろう。

$ sudo systemctl restart rsyslog.service

スワップファイル(swap)を作成して有効にする

クラウド環境やVPS環境ではスワップパーティションが設定されてないことがあります。
メモリが充分に搭載されたホストならよいかもしれませんが、メモリが少ないホストでは、メモリ不足でコマンド自体が正常に動作しなかったり、OOM killerによってサービスが強制終了されたりすることがあるので、スワップ領域を設定しておくとよいでしょう。
スワップ用に利用できるパーティションがないこともあるので、本記事ではスワップファイルを作成してスワップ領域として有効にする方法について説明します。

スワップファイルを作成する

ここでは、/swapfileというパスに2GB(2,048MB)のスワップファイルを作成することにします。

ddコマンドで2GBのファイルを生成し、パーミッションを設定し、mkswapコマンドでファイルにスワップ領域を作成します。(MiB=M)

# dd if=/dev/zero of=/swapfile bs=1M count=$((2*1024))
# chmod 600 /swapfile
# mkswap /swapfile

To set up a swap file, it is necessary to create that file before initializing it with mkswap, e.g. using a command like

# dd if=/dev/zero of=swapfile bs=1MiB count=$((8*1024))

to create 8GiB swapfile.

MKSWAP(8) – NOTES

スワップファイルを有効にする

作成したスワップファイルを有効にしてswapon -sfreeコマンドで確認します。

# swapon /swapfile
# swapon -s
Filename Type Size Used Priority
/swapswapfile file 2097144 0 -1
# free
total used free shared buffers cached
Mem: 1020400 292632 727768 0 79468 129184
-/+ buffers/cache: 83980 936420
Swap: 2097144 0 2097144

ホスト起動時にスワップファイルを有効にする

ホストを再起動した時にもスワップファイルが有効になるように、/etc/fstabへ記述しておきます。
念のために、実際にホストの再起動を行って、スワップが有効になるか確認しておくことを推奨します。

# vi /etc/fstab
/swapfile none swap defaults 0 0

For swap partitions, this field should be specified as none'.

FSTAB(5) The second field (fs_file)

スワップファイルのバーミッションについての警告

パーミッションが適切に設定されていない場合は、swaponの実行時に、次の様な警告が出ることがあります。

swapon: /swapfile: insecure permissions 0644, 0600 suggested.

念のため一旦swapoffでスワップを無効化してから、スワップファイルを推奨のパーミッションである0600に変更し、改めてswaponを実行するとよいでしょう。

# swapoff /swapfile
# chmod 0600 /swapfile
# swapon /swapfile

Rocky Linux のOSバージョンを確認する

redhat-release というファイルに Rocky Linux/CentOS のバージョン情報が記載されている。

$ cat /etc/redhat-release
Rocky Linux release 9.4 (Blue Onyx)

digのインストールとRPMパッケージの探し方

Rocky Linux の環境によっては、digコマンドがインストールされていない場合がある。

digはbind-utilsというパッケージに含まれているので、dnfコマンドでインストールする。

$ sudo dnf install bind-utils

パッケージの探しかた (dnf providesコマンド)

実は、dnf search digと実行してもパッケージは見つからない。

digがどのパッケージに含まれるかを知りたい場合は、dnf providesコマンドで調べるとよい。

$ dnf provides dig
bind-utils-32:9.16.23-18.el9_4.1.x86_64 : Utilities for querying DNS name servers
Repo        : appstream
Matched from:
Filename    : /usr/bin/dig

パッケージの探しかた (rpmコマンド)

既にdigがインストールされている環境であれば、rpmコマンドでもパッケージを調べることが出来る。まずはdigがどこにあるか調べる。

$ which dig
/usr/bin/dig

つぎにrpmコマンドでファイルの所属を確認する。

rpm -qf /usr/bin/dig
bind-utils-9.16.23-18.el9_4.1.x86_64

バッククォートを使うと一行で確認できる。

$ rpm -qf `which dig`
bind-utils-9.16.23-18.el9_4.1.x86_64

このようにして、dnf searchでは見つからないパッケージを調べる事ができる。

制限付きSSHログインシェル rsshのインストール

SCP、SFTPは許可したいけれどもSSHでのログインはセキュリティ上、拒否したいという場合にはログインシェルにrsshをユーザに設定することで実現できる。

SRPMからのリビルドとなるのでrpmbuildをインストールする。

yum -y install rpm-build

また、ビルドに必要なgccなどがないならば同様にyumでインストールしておく。

cd /usr/local/src/
wget http://jaist.dl.sourceforge.net/sourceforge/rssh/rssh-2.3.2-1.src.rpm
rpmbuild --rebuild rssh-2.3.2-1.src.rpm
rpm -ihv  /usr/src/redhat/RPMS/i386/rssh-2.3.2-1.i386.rpm
vi /etc/shells
------------------------------------
/usr/bin/rssh
------------------------------------
vi /etc/rssh.conf
------------------------------------
allowscp
#allowsftp
------------------------------------

CentOSでキーボード配列の変更

インストール時にキーボード配列をusにしてしまった場合、後からも配列を変更できます。
日本語配列のキーボードで無理くり入力しなくてもよくなります。

vi /etc/sysconfig/keyboard
---------------------------
KEYBOARDTYPE="pc"
KEYTABLE="jp106"
---------------------------
shutdown -r now

インストール後にファイアウォール・SELinuxを無効にする

CentOS 6

CentOS 6ではsystem-config-securitylevel-tuiが無くなったので、ファイアウォールとSELinuxをそれぞれ別に設定する。

ファイアウォールはsystem-config-firewall-tuiコマンドで設定できる。

system-config-firewall-tui

もし、コマンドがない場合はyumでインストールする。

yum install system-config-firewall-tui

無効にしたい場合は「ファイアーウォール」の有効のチェックを外してOKボタンを実行すれば良い。
チェックのON、OFFはスペースキーで切り替える。

centos6_firewall.png

SELinuxは手動で無効にする。現在の設定はgetenforceで確認できる。

# getenforce
Enforcing

SELinuxを無効にするにはsetenforceに引数0を与える。(実際にはPermissiveモードになる。)

# setenforce 0
# getenforce
Permissive

このままだとサーバを再起動するとまた有効になってしまうので、
再起動時にも無効になるようにするには/etc/selinux/configを編集しておく。

# vi /etc/selinux/config
SELINUX=disabled

参考記事: SELinuxを無効化する | Smart -Web Magazine


CentOS 5

CentOSをインストール後、再起動直後にファイアウォールの設定ができる。

それをそのままにしておくと通常のログイン画面になってしまうが、system-config-securitylevel-tuiコマンドであとからでもファイアウォールが設定できる。

system-config-securitylevel-tui

Security Level:をDisabledにチェック、SELinux:もDisabledを選択すればファイアウォールが無効になる。

firewall.png

コマンドだけでGUIを使わずに設定することもできるので、シェルスクリプトなどで一括処理する場合に便利。

system-config-securitylevel-tui -q --disabled --selinux='disabled'

fdisk ハードディスクのパーティションを確認するコマンド

CentOS Linuxにおいてdfではわかりにくいハードディスクのパーティションを確認するコマンド

fdisk -l /dev/hda
---------------------------------------------------------------------------
Disk /dev/hda: 750.1 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1        2550    20482843+  83  Linux
/dev/hda2            2551        5100    20482875   83  Linux
/dev/hda3            5101        6375    10241437+  83  Linux
/dev/hda4            6376       91201   681364845    5  Extended
/dev/hda5            6376        6630     2048256   82  Linux swap
/dev/hda6            6631       91201   679316526   83  Linux
---------------------------------------------------------------------------

ログアウト後もバックグラウンド処理 nohup

TeraTermなどの仮想端末からアクセスをしてコマンドを実行したい。
だけど、tarによるバックアップなど時間が確実にかかる。
しかも、パソコン端末ももうすぐ停止しなければいけない。
そんなときには、プロセスをバックグラウンドで処理してログアウトすることができる。
通常、ログアウトするとプロセスも消えてしまうが、nohupコマンドを付け加えてハングアップシグナルを無視することでバックグラウンド処理がログアウト後も継続して実行される。

nohup command &
nohup tar home-backup.tgz /home &

【nohup Manpage】
http://www.linux.or.jp/JM/html/gnumaniak/man1/nohup.1.html