- 序章
- ChatGTPとの対話
- 大きな問題が立ちはだかる
- 修正が必要な部分
- 修正後の手順
- 正しいコマンドの使用方法
- 修正手順
- 解決策
- 1. サービスのログを確認
- 2. スクリプトを直接実行
- 3. サービスファイルの確認
- 4. サービスの再起動
- 5. サービスのステータス確認
- 一時的に無効にする
- 恒久的に無効にする
- 解決策
- 方法 1: config ファイルの正しい配置
- 方法 2: 絶対パスの使用
- 方法 3: スクリプトのディレクトリを動的に取得
- 1. config ファイルの場所
- 2. 日付形式の不一致
- 3. 文字列比較の問題
- 解決策
- ステップ1: Bashスクリプトの作成
- ステップ2: systemdサービスファイルの編集
- ステップ1: ジャーナルログの確認
- ステップ2: スクリプトの実行テスト
- ステップ3: 実行権限の確認
- ステップ4: 環境変数やパスの問題
- ステップ5: 再起動と確認
- 解決策
- 問題の切り分け方法
- 解決方法
- SELinuxが有効か確認
- SELinuxが有効の場合
- SELinuxが無効の場合
- その他の考慮事項
- 1. 実行ファイルの確認
- 2. サービスファイルの確認
- 3. SELinux/AppArmor の確認
- 4. サービスの再起動
- 5. エラーログの確認
- AppArmorの状態を確認
- AppArmorを一時的に無効にする
- AppArmorのプロファイルを無効にする
- AppArmorを再度有効にする
- 1. スクリプトの実行テスト
- 2. シバン(Shebang)の確認
- 3. systemd サービスファイルの確認
- 4. 環境変数の設定
- 5. システムログの詳細確認
- 6. パーミッションの確認
- 改行コードを変換する方法
序章
ナマケモノの回想シーン
暗転からゆっくりとスポットライトが一点、中央のナマケモノに当たる。
ナマケモノは思い悩むように頭を抱えている。

ああ、この悩み…。
WorkWaveやDriveShieldのExmentベースで作成したアプリ…
どうすれば、皆に使ってもらえるのだろう。
突然、ナマケモノが頭を持ち上げる。
目には閃いたばかりのアイデアの光が

そうだ!仮想環境だ!
OracleのVirtualBoxにExmentを構築し、
パッケージ化してダウンロード出来れば…。
しかし、再び顔を曇らせる

でも、Linuxで動くシェルが書けない…
どうすればいい?
ナマケモノ君の周りが暗くなり
孤独と絶望が漂う!

シェル作ってもらえないかなぁ…?
しかも、無料で?

No!
そんな時間ないし、
しかも、タダでなんて(怒)!

ごめんなさい。
そこまで、シェルに精通してないわ。

ああ、やはり答えはNoか。
タダで作成するのは、無理があるよね…。
その時、神からのお告げが

そうか、その手があったか!
必死にネットを検索するナマケモノ君

そして、僕は「wrtn(リートン)」を見つけた。
無料でGPT-4 Turboを使えるんだ!

よし、これでVirtualBoxの仮想環境を有効期限付きで作成できる!
ありがとう、リートン。
君のおかげで僕のアイデアは形になるはずだ!
ChatGTPとの対話

あなたは、優秀なプログラマーです。
下記の前提条件を踏まえ動作内容を実行するスクリプトを作成して下さい。
前提条件
①GUI要素の実装にはzenityを使用
②同じ階層にconfigファイルを設ける
③configファイルに記載されている有効期限を使用する
動作内容
①ゲストOS上で起動
②有効期限が表示される
③有効期限を過ぎていない場合は、そのまま正常起動する
④有効期限が過ぎている場合は、システムをシャットダウンする

こんな感じでチャットを始めれば、GTPは答えてくれるハズだが?

以下のバッシュスクリプトは、指定された前提条件と動作内容に基づいて作成されています。
このスクリプトは、同じ階層にあるconfigファイルから有効期限を読み込み、
その有効期限に基づいてシステムを起動またはシャットダウンします。
configファイルは、EXPIRATION_DATE=YYYY-MM-DDという形式で
有効期限を設定する必要があります。
#!/bin/bash
# configファイルの読み込み
source ./config
# 現在の日付を取得
CURRENT_DATE=$(date +%Y-%m-%d)
# 有効期限の表示
zenity --info --text="有効期限: $EXPIRATION_DATE"
# 有効期限を過ぎているかどうかを確認
if [[ "$CURRENT_DATE" > "$EXPIRATION_DATE" ]]; then
# 有効期限が過ぎている場合、システムをシャットダウン
zenity --warning --text="有効期限が過ぎています。システムをシャットダウンします。"
shutdown now
else
# 有効期限内の場合、通常起動
zenity --info --text="有効期限内です。システムを起動します。"
fi

このスクリプトを実行する前に、
実行権限を与える必要がある場合があります。
これは、以下のコマンドを使用して行うことができます。
※script_name.shは、スクリプトのファイル名に置き換えてください。
chmod +x script_name.sh

configファイルは以下のように設定されている必要があります。
EXPIRATION_DATE=2024-12-31

このスクリプトは、システムの有効期限が過ぎているかどうかに基づいて、
ユーザーに情報を提供し、適切なアクションを取ります。
有効期限が過ぎている場合は、システムを安全にシャットダウンすることで、
不正なアクセスや使用を防ぎます。

このコードの内容だと、
即時シャットダウンしてしまう。
警告を表示した後、60秒くらいでシャットダウンしないと
有効期限を変更する方法がなくなるな!
即時シャットダウンから60秒後に変更してもらおう。

即時シャットダウンではなく、
60秒後にシャットダウンするように変更して下さい

指定された要件に合わせてスクリプトを修正しました。
このスクリプトは、configファイルから有効期限を読み取り、
その有効期限に基づきシステムをシャットダウンするか正常に起動するかを決定します。
有効期限が過ぎている場合、
ユーザーに通知した後、60秒後にシステムをシャットダウンします。
#!/bin/bash
# configファイルから有効期限の読み込み
source ./config
# 現在日付の取得
CURRENT_DATE=$(date +%Y-%m-%d)
# 有効期限の表示
zenity --info --text="有効期限: $EXPIRATION_DATE"
# 有効期限が過ぎているかの確認
if [[ "$CURRENT_DATE" > "$EXPIRATION_DATE" ]]; then
# 有効期限が過ぎている場合、60秒後にシステムをシャットダウン
zenity --info --text="有効期限が過ぎています。60秒後にシステムをシャットダウンします。"
sleep 60
shutdown now
else
# 有効期限内の場合、正常起動
zenity --info --text="有効期限内です。システムを起動します。"
fi

このスクリプトは、
configファイルに指定された有効期限を読み込み、現在の日付と比較します。
有効期限を超えている場合は、
ユーザーに60秒後にシステムがシャットダウンされることを通知し、
sleep 60コマンドを使用して60秒間待機した後、
shutdown nowコマンドでシステムをシャットダウンします。
有効期限内の場合は、システムが正常に起動します。

ついでに、このスクリプトの名前を考えてもらおう。

実行されるスクリプトの内容を加味したファイル名を考えて下さい。

スクリプトの機能に基づき、
ファイル名を「expire_check_shutdown.sh」とします。
この名前は、
「有効期限をチェックし、期限切れの場合にシャットダウンする」
というスクリプトの動作を適切に反映しています。

あっ そうだ!
このスクリプトは、どこに保存すればいいんだ?
これも聞いてみよう!

作成されたシェルは、
どの階層のディレクトリーに置けばいいですか?

このスクリプトは、
configファイルと同じ階層のディレクトリに置く必要があります。
スクリプト内で source ./config というコマンドを使用しており、
これは現在の作業ディレクトリにある configファイルを読み込むことを意味します。
したがって、スクリプトと configファイルは同じフォルダ内に配置してください。

また、スクリプトを実行する前に、
スクリプトファイルに実行権限を与える必要があります。
これは、ターミナルで以下のコマンドを使用して行います
※script_name.sh は、スクリプトの実際のファイル名に置き換えてください
chmod +x script_name.sh

この手順により、スクリプトは実行可能になります。
そして、スクリプトを実行する際には、
スクリプトが存在するディレクトリに移動するか、
もしくはスクリプトのフルパスを使用して実行してください。

まてよ。
このままでは、電源投入後にシェルが実行されないぞ!
どうすればいいんだろう?
そんなときは

電源投入時に自動的に、このスクリプトが実行する方法を教えて。


1.systemd サービスファイルの作成
/etc/systemd/system/ディレクトリに
.service拡張子を持つサービスファイルを作成します。
例えば、script_service.serviceという名前でファイルを作成します。

以下の内容をファイルに記述します。
※ExecStartのパスは、
スクリプトの実際のパスに置き換えてください。
vim /etc/systemd/system/script_service.service
[Unit]
Description=My startup script service
After=network.target
[Service]
Type=simple
ExecStart=/path/to/your/script_name.sh
[Install]
WantedBy=multi-user.target

2.systemd サービスの有効化

サービスファイルを作成した後、
新しいサービスをリロードしてsystemdに認識させます。
systemctl daemon-reload

作成したサービスを有効化し、自動起動を設定します。
systemctl enable script_service.service

サービスをすぐに開始するには、以下のコマンドを実行します。
systemctl start script_service.service

これで、システムの起動時に指定したスクリプトが自動的に実行されるようになります。
スクリプトが期待通りに動作するか確認するために、
システムを再起動してテストすることをお勧めします。

そもそも、実行するシェルは、どこに保存するのがベターなんだ?
これも聞いてみよう!

スクリプトの名前は「expire_check_shutdown.sh」として、
systemd サービスを使用してシェルを実行する場合に、
「expire_check_shutdown.sh」は、どこのディレクトリーに保存すればいいですか?

systemdサービスを使用してスクリプトexpire_check_shutdown.shを実行する場合、スクリプトの保存場所は厳密に決まっているわけではありませんが、
管理しやすいように標準的なディレクトリに保存することが推奨されます。
Linux システムでは、カスタムスクリプトやシステム用のスクリプトを
以下のディレクトリに配置するのが一般的です。

/usr/local/bin/
このディレクトリは、
システムが管理するパッケージ管理システムによってインストールされたプログラム以外の、ユーザーが追加したプログラムやスクリプトに使用されることが多いです。
システム全体で利用されるスクリプトに適しています。

/opt/
特に大規模なソフトウェアやアプリケーションを
インストールする場合に使用されることが多いディレクトリです。
スクリプトに関連する他のファイルや設定が多数ある場合は、/opt/以下に専用のディレクトリを作成して管理することができます。

そのため、expire_check_shutdown.shスクリプトを
/usr/local/bin/に保存することをお勧めします。
これにより、スクリプトはシステム全体で容易に実行可能となり、管理もしやすくなります。

スクリプトの配置と権限設定
1.スクリプトを/usr/local/bin/にコピーまたは移動します。
2.スクリプトに実行権限を与えます。
mv /path/to/expire_check_shutdown.sh /usr/local/bin/
※ /path/to/は、現在のスクリプトの場所を指します。
chmod +x /usr/local/bin/expire_check_shutdown.sh

このように配置し権限を設定した後、
systemdサービスファイル内でExecStartパラメータに、
このパス/usr/local/bin/expire_check_shutdown.shを指定することで、
システム起動時に自動的にスクリプトが実行されるようになります。

よし!これで完成した。
さっ 実際に上手くいくかテストするぞ!
※使用する際は、自己責任でお願い致します。
コーポレートサイトhttps://www.rin-tech.netを開設しました。
どうぞ、よろしくお願いいたします。




コメント