タグ: Ubuntu Page 2 of 16

Apache設定ファイル反映を効率化するスクリプトをコマンド化。

先日ご紹介したApache環境のWebサービス再起動を効率的に行うスクリプトをコマンドとして登録します。

コマンドとして登録

  • 実行権限付与
sudo chmod +x apache_check_restart.sh
  • シンボリックリンク付与
sudo ln -s /path/to/script/apache_check_restart.sh /usr/local/bin/apache_check_restart

スクリプトが配置されたディレクトリをフルパスで書きます。

  • シンボリックリンク付与確認
 which apache_check
/usr/local/bin/apache_check_restart

実行例

sudo apache_check_restart
==== 有効なサイト設定ファイル ====
設定ファイル: atelier.conf
ServerName atelier.reisalin.com
servername atelier.reisalin.com
設定ファイル: bookstack.conf
ServerName barrel.reisalin.com
servername barrel.reisalin.com
構文チェック中...
Syntax OK
構文チェック完了: 問題ありません。
Apacheを再起動しますか? (y/n): 

Apacheが正常に再起動されました。

となり、yならapacheサービスを再起動後にステータスを表示。nならそのままスクリプトを抜けます。

Apacheのサービス再起動と確認スクリプト。

Ubuntu 24.04/Apache環境で

  • 再起動前に稼働しているサイトを確認
  • 構文チェック
  • 再起動
  • 再起動後のサービス状況

を一括で行うスクリプトです。

スクリプト

  • apache_check_restart.sh
#!/bin/bash


# サイト設定ディレクトリ
SITES_DIR="/etc/apache2/sites-enabled"

# スクリプトを root ユーザーで実行しているかチェック
if [ "$EUID" -ne 0 ]; then
    echo "このスクリプトは root 権限で実行する必要があります。"
    exit 1
fi

# 1. /etc/apache2/sites-enabled 配下のファイルとURL表示
echo "==== 有効なサイト設定ファイル ===="
if [ -z "$(ls -A $SITES_DIR)" ]; then
    echo "サイト設定が存在しません。"
else
    for site in "$SITES_DIR"/*; do
        echo "設定ファイル: $(basename "$site")"
        # URL部分を含むServerNameやServerAliasをgrepして表示 (重複行を削除)
        grep -Ei "ServerName|ServerAlias" "$site" | sed 's/^[ \t]*//' | sort | uniq
    done
fi

echo "=================================="

# 2. Apache構文チェック
echo "構文チェック中..."
apachectl configtest
if [ $? -ne 0 ]; then
    echo "構文エラーが検出されました。Apacheを再起動できません。"
    exit 1
fi
echo "構文チェック完了: 問題ありません。"

# 3. Apache再起動の確認
read -p "Apacheを再起動しますか? (y/n): " CONFIRM
if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then
    echo "Apacheを再起動します..."
    systemctl restart apache2
    if [ $? -ne 0 ]; then
        echo "Apacheの再起動に失敗しました。"
        exit 1
    fi
    echo "Apacheが正常に再起動されました。"

    # 4. Apacheステータス確認
    echo "==== Apacheステータス ===="
    systemctl status apache2 --no-pager
else
    echo "Apacheの再起動はキャンセルされました。"
fi

root権限で作成し、

sudo chmod +x apache_check_restart.sh

で実行権限を付与します。

動作例

sudo bash apache_check_restart.sh
==== 有効なサイト設定ファイル ====
設定ファイル: atelier.conf
ServerName atelier.reisalin.com
servername atelier.reisalin.com
設定ファイル: bookstack.conf
ServerName barrel.reisalin.com
servername barrel.reisalin.com
構文チェック中...
Syntax OK
構文チェック完了: 問題ありません。
Apacheを再起動しますか? (y/n): 

Apacheが正常に再起動されました。
==== Apacheステータス ====
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: enabled)
     Active: active (running) since Wed 2024-12-18 08:23:29 JST; 12ms ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 335542 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
      Tasks: 11 (limit: 4690)
     Memory: 535.1M (peak: 2.2G swap: 0B swap peak: 67.9M)
        CPU: 510ms
     CGroup: /system.slice/apache2.service
             ├─335551 "Passenger core"
             ├─335577 "PassengerWatchdog (cleaning up...)"
             └─335580 /usr/sbin/apache2 -k start

と表示されます。上記、一連の流れを一括で行うので便利です。

Redmineに「いいね」機能を付与。

Redmineにソーシャルネットワークのように「いいね!」をつけるプラグインです。

環境

以下の環境で確認しています。

  • Ubuntu 24.04
  • Redmine 5.1
  • MySQL
  • Apache 2.4
  • Ruby 3.2

Redmine heartsインストール

  • Redmine プラグインディレクトリに移動
cd /path/to/redmine/root/directory/plugins

自分の環境に合わせます。

  • git clone
sudo -u www-data git clone --branch v3.0.0 --depth 1  https://github.com/cat-in-136/redmine_hearts

バージョンを指定したのは、本Redmineが4.2からアップデートしたこともあります。

  • マイグレーション
cd /path/to/redmine/root/directory/

Redmineのルートディレクトリに移動します。

 sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production
  • Webサービス再起動
sudo systemctl restart apache2.service && echo $?

0が返ってくることを確認します。

  • 確認

設定後のRedmineにブラウザでアクセス。

いいね!欄がつけばOKです。

inotifywaitコマンドによるファイル書き換え状況の調査。

ちょっとした調査のためにinotifywaitを使ったので、そのメモです。

概要

inotifywait は、Linux の inotify インターフェースを利用してファイルやディレクトリの変更をリアルタイムで監視するコマンドです。これにより、ファイルの作成、削除、変更などのイベントを検知できます。

インストール方法

好みに応じてapt-getを利用します。

sudo aptitude install inotify-tools

基本的な使用例

特定のディレクトリ内でのファイル変更を監視する基本的な例です。

inotifywait -m /path/to/directory

このコマンドは、指定したディレクトリ内のファイル変更を監視し、変更があるたびにそのイベントを表示します。

特定のイベントを監視

特定のイベント(例: ファイルの修正)のみを監視する場合は、-e オプションを使用します。

inotifywait -m -e modify /path/to/directory

出力を tee コマンドでログに追記

監視結果をリアルタイムで表示しつつ、ログファイルに追記するには tee コマンドを使用します。

inotifywait -m /path/to/directory | tee -a /path/to/logfile.log

表示例

以下は、inotifywait コマンド実行時の表示例です。

inotifywait -m -e modify /path/to/directory
Setting up watches.
Watches established.
`/path/to/directory/modified_file.txt` MODIFY

この例では、/path/to/directory 内の modified_file.txt が修正されたことが検知されています。

tee コマンドを使用したログ追記例

監視結果をログファイルに追記する例を示します。以下のコマンドは、/home/mongodb ディレクトリ内での変更を監視し、イベントが発生するたびにその内容を mongodb_changes.log に記録します。

sudo inotifywait -m -e modify,create,delete /home/mongodb/ | tee -a mongodb_changes.log

実行例:

Setting up watches.
Watches established.
`/home/mongodb/` MODIFY index-143--5004584659078615538.wt
`/home/mongodb/` MODIFY WiredTiger.wt
`/home/mongodb/` CREATE WiredTiger.turtle.set
`/home/mongodb/` MODIFY collection-4--5004584659078615538.wt

このコマンドは、変更イベントをリアルタイムで表示するとともに、mongodb_changes.log にも追記します。

BBC Newsの見出しを取得するBashスクリプト・改良

概要

以前に書いたBBC Newsの特定のセクションから最新の見出しを取得するBashスクリプトを改良しました。Ubuntu 24.04で動作を確認しています。

必要なライブラリのインストール

このスクリプトを実行するには、xmllintが必要です。

sudo aptitude update
sudo aptitude install libxml2-utils

コード

bbc_headlin.sh

#!/bin/bash

# デフォルト値の設定
default_section="world"
default_count=3

# メインセクションのリスト
main_sections=("world" "uk" "business" "politics" "health" "education" "science_and_environment" "technology" "entertainment_and_arts")

# 引数の処理
if [[ "$1" =~ ^[0-9]+$ ]]; then
section=$default_section
count=$1
else
section=${1:-$default_section} # 引数1が指定されていない場合はデフォルト値を使用
count=${2:-$default_count}     # 引数2が指定されていない場合はデフォルト値を使用
fi

# メインセクションのURLの構築
if [[ ! " ${main_sections[@]} " =~ " ${section} " ]]; then
echo "Error: Invalid section '${section}'. Valid sections are: ${main_sections[*]}"
exit 1
fi

url="https://feeds.bbci.co.uk/news/${section}/rss.xml"

# BBC NewsのRSSフィードから見出しを取得
headlines=$(curl -s "$url" | xmllint --format - | grep -oP '(?<=<title>).*?(?=</title>)' | sed -n '3,'"$((count+2))"'p' | sed 's/<!\[CDATA\[//g' | sed 's/\]\]>//g')

# 見出しの表示
if [ -z "$headlines" ]; then
echo "No headlines found for section '${section}'. Please check the section name or try again later."
else
echo "BBC News - ${section} section (${count} headlines)"
echo "$headlines"
fi

作成後、

chmod +x bbc_headline.sh

としてスクリプトに実行権を与えます。

動作例

このスクリプトの動作例です:

デフォルトのセクション(world)から3つの見出しを取得する場合:

./bbc_headline.sh
  • 出力例:
BBC News - world section (3 headlines)
I hope Assad pays the price, says mother whose son's death inflamed 2011 Syrian revolution
Israel confirms attack on Syrian naval fleet
Another headline example

technologyセクションから5つの見出しを取得する場合:

./bbc_headline.sh technology 5
  • 出力例:
BBC News - technology section (5 headlines)
Tech company announces new product
Breakthrough in AI technology
Another tech headline
More tech news
Latest in technology

見出し数のみを指定する場合(デフォルトのセクションworldを使用):

./bbc_headline.sh 5
  • 出力例:
BBC News - world section (5 headlines)
I hope Assad pays the price, says mother whose son's death inflamed 2011 Syrian revolution
Israel confirms attack on Syrian naval fleet
Another headline example
More world news
Latest in world news

利用可能なセクション

利用可能なセクション
スクリプトで指定できるセクションは、以下の通りです:

  • world: 世界のニュース
  • uk: イギリス国内のニュース
  • business: ビジネス関連のニュース
  • politics: 政治関連のニュース
  • health: 健康関連のニュース
  • education: 教育関連のニュース
  • science_and_environment: 科学・環境関連のニュース
  • technology: テクノロジー関連のニュース
  • entertainment_and_arts: エンターテインメント・アート関連のニュース

メインセクション及び見出し数を引数として利用できるのが改善点です。

snipe-itでのDBマイグレーションエラー(プロフィール画像の更新時にエラー)に対処。

Ubuntu 20.04→Ubuntu24.04にデータ移行を行った資産管理ツールsnipe-it。

その後、バージョンアップを行いましたが、それに伴うDBの不整合が問題でエラーが発生しました。

こちら、メモとして残します。

環境

  • Ubuntu 24.04
  • php 8.3
  • MySQL 8.0.40
  • Apache 2.4
  • Snipe-IT v7.0.12

発生したエラー

自分のアカウントの画像を変更しようとしたところ、500 internal server errorが発生しました。

エラーの特定

  • snipe-itのログディレクトリに移動
cd /home/www-data/snipe-it/storage/logs
  • ログ確認
cat laravel.log |grep ERROR
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'enable_sounds' in 'field list'

プロファイルの編集にこのような機能があったことから、DBのusersテーブルにenable_soundsenable_confetti列が存在しないことが原因で、画像変更時にSQLエラーが発生したと考えられます。

調査

このエラーが原因と考え、まずはsnipe-itのルートディレクトリに移動。

cd /home/www-data/snipe-it

artisan migrateを実行。

sudo -u www-data php artisan migrate

以下のエラーが見つかりました。

SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'accessories_checkout' already exists

対処を行います。

対処

MySQLでの対処

  • MySQLログイン
mysql -u snipeit -p snipeit
  • DB切り替え
USE SNIPEIT;
  • テーブル確認
SELECT * FROM migrations WHERE migration = '2024_07_26_143301_add_checkout_for_all_types_to_accessories';

→ 結果: Empty Set このため、これが記録されていないことが分かりました。

  • 該当テーブルの構造確認
DESCRIBE accessories_checkout;

→ テーブルが既に存在しています。

このことで、マイグレーションをスキップして対応することにしました。

  • マイグレーションスキップ
INSERT INTO migrations (migration, batch) VALUES ('2024_07_26_143301_add_checkout_for_all_types_to_accessories', 1);
  • MySQLログアウト
exit

phpでの対応

  • snipe-itのルートディレクトリ確認
cd /home/www-data/snipe-it && pwd

/home/www-data/snipe-itを確認

  • 改めてのDBマイグレーション
sudo -u www-data php artisan migrate
  • マイグレーション結果
2024_08_06_175114_add_shortcuts_enabled_to_settings_table ......................................................... DONE
2024_08_07_204014_add_play_sounds_to_profile ..................................................................... DONE
2024_08_15_111816_add_confetti_to_users .......................................................................... DONE
2024_08_16_104137_add_due_checkin_days_to_settings ............................................................... DONE

今度はマイグレーションが通ったことを確認です。

  • 結果反映
sudo -u www-data php artisan config:clear
sudo -u www-data php artisan cache:clear
sudo -u www-data php artisan view:clear
  • Webサービス再起動
sudo systemctl restart apache2.service && echo $?

0と表示されれば正常に再起動しています。

対処完了確認

ブラウザでsnipe-itにアクセスし、画像がアップロードされることが確認できたので、対処完了です。

Redmine 5.1にWikiエディタのフルスクリーンモードを追加するプラグイン。

概要

RedmineのWiki編集ページを他のマークダウン対応エディタのようにフルスクリーンモードを追加します。

動作を確認した環境

  • Ubuntu 22.04 / 24.04
  • Redmine 5.1
  • Apache 2.4

さっくりとした手順

  1. Redmineのプラグイン配置ディレクトリに移動します。
  2. git cloneを行います。
  3. Webサービスを再起動します。
  4. 動作を確認します。

Redmine プラグイン配置ディレクトリに移動

cd /home/www-data/redmine && pwd

自分の環境に合わせます。

プラグインインストール

  • git clone
sudo -u www-data git clone https://github.com/sk-ys/redmine_wiki_fullscreen_editor
  • clone 確認
ls -ld redmine_wiki_fullscreen_editor

ディレクトリがあることを確認します。

Webサービス再起動

sudo systemctl restart apache2.service

動作確認

  1. Redmineに管理者権限でログインします。
  2. チケットやコメント編集など、任意のWiki編集画面を表示させます。
  3. 以下のように「フルスクリーン有効化」ボタンが出ればインストール完了です。

終わらせるときは右上の「フルスクリーン無効化」をクリックすれば解除できます。

続・Ubuntuで特定のディレクトリに移動した際にカスタムメッセージを表示する。

こちらの記事に更に処理を付け加えました。

  • /etc/profile.d/cd.sh
# カスタムcd関数を定義
cd() {
# ビルトインcdコマンドの実行
builtin cd "$@" || return

# PWDに基づいて処理を実行
case "$PWD" in
"/etc/apache2/sites-available")
echo "注意: .confファイルのバックアップを取ること"
;;
"/var/log" | "/var/log/"*)
echo "注意: ログファイルを定期的にチェックすること"
;;
# 任意の作業ディレクトリを追加
"/home/hoge/work")
echo "作業ディレクトリに移動しています..."
new_dir="$(date +%Y%m%d)"
mkdir -p "$new_dir" && builtin cd "$new_dir"
;;
*)
# 他のディレクトリでは何もしない
;;
esac

# 現在のディレクトリを表示
pwd
}

付け加えた機能は

  • cd コマンド実行時、pwdを追加で行う。
  • /var/log 配下全てのディレクトリで 「注意: ログファイルを定期的にチェックすること」と表示されるようにしたこと。
  • 任意の作業ディレクトリに遷移した際、自動的にyyyymmdd形式のディレクトリを作り、更にそのディレクトリに移動する。

後は

sudo chmod +x /etc/profile.d/cd.sh
source /etc/profile.d/cd.sh

とすれば、運用時の注意点や作業ディレクトリの自動作成まで行ってくれます。

Ubuntuで特定のディレクトリに移動した際にカスタムメッセージを表示する。

概要

Ubuntuで、特定のディレクトリに移動した際にカスタムメッセージを表示するTIPSです。

例えば、cd /etc/apache2/sites-availableとしたときに「.confファイルのバックアップを取ること」といった確認メッセージを表示させることができます。

環境a

  • Ubuntu 22.04 /24.04
  • BashまたはZshシェル

手順

1. スクリプトを作成

まず、/etc/profile.d/cd.shにカスタムcd関数を追加します。

sudo tee -a /etc/profile.d/cd.sh > /dev/null << 'EOF'
# カスタムcd関数を定義
cd() {
# ディレクトリに移動
builtin cd "$@"

# 特定のディレクトリに移動したときのメッセージ
case "$PWD" in
"/etc/apache2/sites-available")
echo "注意: .confファイルのバックアップを取ること"
;;
"/var/log")
echo "注意: ログファイルを定期的にチェックすること"
;;
*)
# 他のディレクトリの場合は何もしない
;;
esac
}
EOF

2. スクリプトに実行権限を付与します。

sudo chmod +x /etc/profile.d/cd.sh

3. スクリプトを反映

source /etc/profile.d/cd.sh

動作確認

設定が正しく反映されているか確認するために、特定のディレクトリに移動してみます。

cd /etc/apache2/sites-available

注意: .confファイルのバックアップを取ることと表示されることを確認します。

cd /var/log

注意: ログファイルを定期的にチェックすることと表示されることを確認します。

スクリプト修正ポイント

ディレクトリの追加:

新しいディレクトリに対してメッセージを表示させたい場合は、case文に新しい条件を追加します。

メッセージの変更:

各ディレクトリに対するメッセージを変更する場合は、echoコマンドの内容を編集します。

case "$PWD" in
"/new/directory/path")
echo "新しいディレクトリに移動しました"
;;
# 他のディレクトリの条件を追加
esac

これで、特定のディレクトリに移動したときにカスタムメッセージを表示する方法が設定できました。

Ubuntu24.04のauth.logから不正ログイン試行を確認するワンライナー。

Ubuntu 24.04でWebサーバを公開中。

/var/auth.logから、失敗したアクセス(認証に失敗したユーザー)を確認するためのワンライナーです。

  • コマンド
sudo awk '/Disconnected from invalid user/ {print $(NF-4)}' /var/log/auth.log | sort | uniq -c | sort -nr
  • 実行結果
43 root
36 ubuntu
24 user
20 test
13 admin
8 deploy
6 guest
6 ftpuser
5 oracle
5 hadoop
5 dev
5 debian
4 user1
4 sysadmin
4 samba
3 test1
3 mysql
3 max
3 kafka

と、アカウントごとに失敗したユーザーを表示してくれます。

成功したログインを日付時刻を付与した上で表示する

/var/auth.logから、ログインに成功したユーザーを調べます。

  • コマンド
sudo awk '/Accepted/ {split($1, date, "T"); split(date[2], time, "."); gsub("-", "/", date[1]); print date[1] " " substr(time[1], 1, 5) " " $7}' /var/log/auth.log | sort | uniq -c | sort -nr

日付は2024-11-25T16:21:14.772402+09:00のような形式から2024/11/25 14:38に修正しています。ログの形式が異なる場合は調整が必要です。

  • 実行結果
1 2024/11/25 14:38 hoge

これで、ログの視認性が高まりました。

Page 2 of 16

Powered by WordPress & Theme by Anders Norén