タグ: Linux Page 10 of 24

ChatGPTが作ったシェルスクリプトをBing(Copilot)が修正

以前にChatGPTが作成した天気予報スクリプト。

これをBing(Copilot)が改善・修正したらどうなるかという検証です。

修正前のスクリプト

#!/bin/bash

# ユーザーに都市名を尋ねる
echo "都市名を入力してください:"
read city

# ansiweatherコマンドを実行して天気情報を表示
echo "ansiweatherの情報:"
ansiweather -l "$city"

# curlコマンドを使用してwttr.inから天気情報を表示
echo "wttr.inの情報:"
curl wttr.in/"$city?lang=ja"

行うことは単純。プロンプトで都市名を尋ね、その都市の天気予報をansiweatherとwttr.inで表示させるというもの。

これを改善案を示して欲しいですと聞いてみました。

修正後のスクリプト

  • getweather.sh
#!/bin/bash

# 都市名をコマンドライン引数から取得するか、ユーザーに尋ねる
city=$1
if [[ -z "$city" ]]; then
echo "都市名を入力してください:"
read city
if [[ -z "$city" ]]; then
echo "都市名が入力されませんでした。"
exit 1
fi
fi

# ansiweatherコマンドを実行して天気情報を表示
echo "ansiweatherの情報:"
if ! ansiweather -l "$city"; then
echo "ansiweatherから情報を取得できませんでした。"
fi

# curlコマンドを使用してwttr.inから天気情報を表示
echo "wttr.inの情報:"
if ! curl -s "wttr.in/${city}?lang=ja"; then
echo "wttr.inから情報を取得できませんでした。"
fi

スクリプトの動き

対話式

./getweather.sh 

都市名を引数にする

./getweather.sh Paris

と、対話式でもコマンドからでも実行できるようになっています。この、都市を引数に指定することによって、他のシェルスクリプトにも転用できるのはいい改良案という形でした。

Ubuntu 22.04に資産管理システム『Snipe-IT』をインストール。

環境

前提

  • ドメインで名前解決できること
  • そのドメインに即した証明書があること

さっくりとした手順

  1. Snipe-IT用のDBを作成します。
  2. Snipe-ITをダウンロードします。
  3. Composerでインストールを行います。
  4. Apacheの設定を行います。
  5. Web画面からインストールを行います。

手順

  • Web画面以外はSSH/ターミナルで操作を行います。
  • Apacheの実行ユーザはwww-dataです。自分の環境に合わせます。

MySQLでDB作成

  • コンソールログイン
mysql -u root -p
  • DB作成
CREATE DATABASE snipeit character set utf8mb4;
CREATE USER 'snipeit'@'localhost' IDENTIFIED BY 'password';

この'password'は任意のパスワードに変更してください

GRANT ALL ON snipeit.* TO 'snipeit'@'localhost';
flush privileges;
exit
  • DB作成確認
  • 設定したパスワードでログインできることを確認
mysql -u snipeit -p
  • DB確認
SHOW DATABASES;

snipeitがあることを確認

  • ログアウト
exit

プログラム配置

  • Webサイト配置ディレクトリに移動
cd /home/www-data && pwd

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

  • ダウンロード
sudo -u www-data git clone https://github.com/snipe/snipe-it snipe-it
  • ディレクトリ移動
cd snipe-it
  • .envを作成
sudo cp -pi .env.example .env
  • .env修正

※教義・信仰に沿ったエディタで編集します。※

  • 修正箇所
APP_URL=http://ドメイン名

snipe-itを動かすドメイン名です。

APP_TIMEZONE='Asia/Tokyo'

タイムゾーンを指定します。

DB_DATABASE=snipeit
DB_USERNAME=snipeit
DB_PASSWORD= 

DB名/ユーザ名/パスワードは上述したDB作成で指定したものです。

修正後、.envを保存します。

composerでsnipe-itインストール

  • 依存関係のアップデート
sudo -u www-data composer update --no-plugins --no-scripts
  • インストール
sudo -u www-data composer install --no-dev --prefer-source --no-plugins --no-scripts
  • APPキー作成
sudo -u www-data php artisan key:generate

途中のプロンプトには「yes」を入力します。

バーチャルサイト作成

  • ログ格納ディレクトリを作成
sudo mkdir -p /var/log/snipeit

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

  • ログ格納ディレクトリの権限変更
sudo chown -R www-data:www-data /var/log/snipeit
  • バーチャルファイル作成
  • Snipe-IT用の設定ファイル作成
  • 【】の箇所は、自分の環境に合わせて修正してください。
cat <<- __EOF__ | sudo tee -a /etc/apache2/sites-available/snipeit.conf
<VirtualHost *:80>
    # ドメイン名を指定します
    servername 【hoge.example.com】
    # HTTPアクセスを強制的にHTTPSにリダイレクトします
    RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    # ドメイン名を指定します
    ServerName 【hoge.example.com】
    # 上述したログディレクトリを指定します。
    CustomLog /var/log/snipeit/snipeit_access.log combined
    ErrorLog /var/log/snipeit/snipeit_error.log

    # Snipe-ITのプログラムを配置したディレクトリを指定します。
    DocumentRoot 【/home/www-data/snipe-it/public】
    <Directory 【/home/www-data/snipe-it/public】>
        Options -MultiViews
        AllowOverride All
        Require all granted
    </Directory>

#SSL設定
  SSLEngine on
    Protocols h2 http/1.1

    # SSL証明書を指定します
    SSLCertificateFile 【/etc/certs/hoge.example.com.crt】
    # 秘密鍵を指定します
    SSLCertificateKeyFile 【/etc/private/hoge.example.com.key】

    # 中間証明書が発行元から別ファイルで提供されている場合は、このすぐ下をコメントアウトして中間証明書を指定します
    # SSLCACertificateFile 【/etc/certs/hoge.example.com.CA.crt】

#セキュリティヘッダー付与

    Header always set Strict-Transport-Security "max-age=63072000"
    Header set X-Content-Type-Options "nosniff"
    Header always append X-Frame-Options "SAMEORIGIN"
    Header set X-XSS-Protection "1; mode=block"

</VirtualHost>

# これらのセクションはSSL暗号化強度を高めるための記述です
# </VirtualHost>の外側に書くことにご注意ください

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:EC6-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off

SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
__EOF__
  • コンフィグ有効化
sudo a2ensite snipeit.conf
  • コンフィグの文法確認
sudo apache2ctl configtest

Syntax OKを確認します

  • apache再起動
sudo systemctl restart apache2.service

Web画面からの設定確認

ブラウザで

https://設定したURL

にアクセスします。

ここまで来れば目前です。ガイダンスに従って管理者情報などを入力。

このようなダッシュボードが確認できればインストール成功です。

BookStackにGoogleフォントを設定。

こちらでBookStackに任意のフォントを設定する方法を説明しましたが、

Webで公開されているGoogleフォントに置き換えます。

設定

管理者権限でログイン後、
設定>カスタマイズ>カスタムheadタグに進みます。

以下のコードを入れます。

<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100..900&display=swap" rel="stylesheet">
<style>
body, h1, h2, h3, h4, h5, h6 {
font-family: 'Noto Sans JP', sans-serif;
}
</style>

ここでは Noto Sans JPを入れています。適宜合わせてください。

設定後、

のように、Googleフォントに変わっていれば設定完了です。

ChatGPTによるスクリプト修正。(通貨変換)

海外通販で、ドル円計算が面倒なのでスクリプト化。

以前、ChatGPTで作成した通貨変換スクリプトを、以下のようにChatGPT自身に修正してもらいました。

  1. CSVへの記録ではなく、○ドル◆円のように表示する。
  2. 通貨ペアの変換前の数値をプロンプトで尋ねる。(空白エンターは1)
  3. その数値で計算する。(例えば3ドル○円など)

修正した結果がこちらです。

スクリプト内容

  • currency_check.sh
#!/bin/bash

#### 変数定義ここから #####
# 通貨ペアの変換前の数値を取得する。
read -p "変換したい通貨の数値を入力してください(空白エンターは1): " conversion_factor
if [ -z "$conversion_factor" ]; then
    conversion_factor=1
fi

# 通貨ペアを変数化する。
# USDJPY=ドル円
# EURUSD=ユーロドル
# など、以下のURLに沿ったものを指定
base_currency="USD"
target_currency="JPY"
#### 変数定義ここまで ####

# 1. コマンドを実行してデータを取得し、標準エラー出力を/dev/nullにリダイレクトする。
data=$(wget -O - -U "" http://www.gaitameonline.com/rateaj/getrate 2> /dev/null)

# 2. 現在時刻を取得する。
date=$(date '+%Y/%m/%d')
time=$(date '+%H:%M')

# 3. 指定された通貨ペアの情報を取得する。
currency_data=$(echo "$data" | grep -o '{"high":"[0-9]*\.[0-9]*","open":"[0-9]*\.[0-9]*","bid":"[0-9]*\.[0-9]*","currencyPairCode":"'$base_currency$target_currency'","ask":"[0-9]*\.[0-9]*","low":"[0-9]*\.[0-9]*"}')

# 4. 必要な情報を取り出し、並び替える。
currencyPairCode=$(echo "$currency_data" | grep -o 'currencyPairCode":"'$base_currency$target_currency'"' | cut -d ':' -f 2 | tr -d '"')
open=$(echo "$currency_data" | grep -o 'open":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
high=$(echo "$currency_data" | grep -o 'high":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
bid=$(echo "$currency_data" | grep -o 'bid":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
ask=$(echo "$currency_data" | grep -o 'ask":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
low=$(echo "$currency_data" | grep -o 'low":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')

# 5. 結果を表示する。
echo "$date $time ${conversion_factor} $base_currency は $target_currency で以下の通りです。"
echo "始値: $open $target_currency"
echo "高値: $high $target_currency"
echo "売値: $bid $target_currency"
echo "買値: $ask $target_currency"
echo "安値: $low $target_currency"
  • 実行権付与
chmod +x currency_check.sh

動き

./currency_check.sh
変換したい通貨の数値を入力してください(空白エンターは1): 74
2024/03/13 14:25 74 USD は JPY で以下の通りです。
始値: 10,926.10 JPY
高値: 10,926.10 JPY
売値: 10,924.62 JPY
買値: 10,925.36 JPY
安値: 10,895.02 JPY

と、ブラウザを開くことなく結果が出るようになりました。

Linuxコマンド:ansiweatherのチートシート。

コマンドライン上から簡単な天気予報を行えるansiweatherのちょっとした早見表です。

主なオプション

オプション説明
-l location場所を指定します。city,CCの形式で、CCは国コードです
-u system単位系を指定します。metricかimperialです
-f days予報モードを切り替えます。指定した日数分の予報を表示します
-F予報モードを切り替えます。次の5日間の予報を表示します
-a valueANSIカラーの表示を切り替えます。trueかfalseです
-s value記号の表示を切り替えます。trueかfalseです
-i valueUVインデックスの表示を切り替えます。trueかfalseです
-w value風のデータの表示を切り替えます。trueかfalseです
-h value湿度のデータの表示を切り替えます。trueかfalseです
-p value気圧のデータの表示を切り替えます。trueかfalseです
-d value日の出/日の入りのデータの表示を切り替えます。trueかfalseです
-vバージョンを表示します

実行例

  • 東京の現在の天気を絵文字付きで表示
ansiweather -l Tokyo,JP -s true

 Weather in Tokyo => 9 °C ☔ - Wind => 3.6 m/s ESE - Humidity => 69 % - Pressure => 1002 hPa 
  • ロンドンの5日分の天気予報を表示
ansiweather -l London,UK -F

 London forecast => Fri Mar 08: 9/5 °C - Sat Mar 09: 12/7 °C - Sun Mar 10: 9/6 °C - Mon Mar 11: 9/6 °C - Tue Mar 12: 11/5 °C 
  • 尾道の日の出・日の入りを表示
ansiweather -l Onomichi,JP -d true

 Weather in Onomichi => 7 °C - Wind => 7.31 m/s WNW - Humidity => 50 % - Pressure => 1013 hPa - Sunrise => Mar 08 06:27:27 AM - Sunset => Mar 08 06:08:49 PM

このあたりをmotodに仕込んでおくと、ログインのたびに天気予報が表示されるので便利です。

xmlフィードから最新の見出しを表示するスクリプト。

スクリプト概要

  1. BBCのRSSフィードをcurlする
  2. そこから指定の見出しを持ってくる

スクリプトの内容

  • bbc_headline.sh
#!/bin/bash

# セクションを指定
section="world"  # ここでセクションを変更

# BBC NewsのRSSフィードから見出しを取得
url="https://feeds.bbci.co.uk/news/${section}/rss.xml"
headlines=$(curl -s "$url" | grep -E '<title>' | sed -n 's/.*<title><!\[CDATA\[\(.*\)\]\]><\/title>.*/\1/p' | sed -n '2,4p')

# 見出しを表示
echo "BBC News - ${section} section"
echo "$headlines"
  • 実行権付与
chmod +x bbc_headline.sh

実行例

  • コマンド実行
./bbc_headline.sh
  • 表示結果
BBC News - world section
'We know what's coming': East Ukraine braces for Russian advance
Trump challenges Biden to TV debates 'anytime'
Australian charged over high-profile disappearance

コマンドベースでブラウザを実行するなく見出しだけでも確認できます。

Redmineにチケットの終了日を知らせるプラグイン。

概要

そのチケットがいつ閉じられたかを詳細に表示させます。

シンプルで便利なプラグインです。

動作を確認した環境

  • Ubuntu 20.04 / Redmine 4.2
  • Ubuntu 22.04 / Redmine 5.1

両方で動きました。また、両方ともApache環境です。

手順

  • ディレクトリ移動
cd /var/lib/redmine/plugins && pwd

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

  • git clone
sudo -u www-data git clone https://github.com/fraoustin/redmine_closed_date
  • マイグレーション
sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production
  • サービス再起動
sudo systemctl restart apache2.service
  • 動作確認

クローズしたチケット詳細に「クローズしたチケット」とその日付が出てくればOKです。

Ubuntu 22.04に構築したNextcloudとClamAVを連携させる。

概要

NextcloudとClamAVを連携させます。

環境

  • Ubuntu 22.04
  • Nextcloud 28.02
  • ClamAV 0.103

さっくりとした手順

  1. clamav-daemonを有効化します。
  2. ウイルス定義ファイル(freshclam)を定期的に実行させます。
  3. NextcloudにAntivirusを導入します。
  4. NextcloudのAntivirusを連携させます。

参考にした手順:
https://rair.dev/nextcloud-clamav-antivirus/

前提

  • 性質上、かなりリソースを消費します。ある程度のマシンスペックを覚悟してください。
  • ClamAVをインストールしていることが条件です。

ClamAVを有効化します。

  • ClamAV daemon 状況確認
sudo systemctl status clamav-daemon.service

実行結果

○ clamav-daemon.service - Clam AntiVirus userspace daemon
     Loaded: loaded (/lib/systemd/system/clamav-daemon.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/clamav-daemon.service.d
             └─extend.conf
     Active: inactive (dead)
  Condition: start condition failed at Tue 2024-02-20 16:09:56 JST; 19h ago
             └─ ConditionPathExistsGlob=/var/lib/clamav/daily.{c[vl]d,inc} was not met
       Docs: man:clamd(8)
             man:clamd.conf(5)
             https://docs.clamav.net/

最初はエラーになったので、再起動をします。

  • ClamAV daemon 再起動
sudo systemctl restart clamav-daemon.service
  • 再起動後の状況確認
sudo systemctl status clamav-daemon.service
● clamav-daemon.service - Clam AntiVirus userspace daemon
     Loaded: loaded (/lib/systemd/system/clamav-daemon.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/clamav-daemon.service.d
             └─extend.conf
     Active: active (running) since Wed 2024-02-21 11:44:33 JST; 4s ago
       Docs: man:clamd(8)
             man:clamd.conf(5)
             https://docs.clamav.net/
    Process: 54279 ExecStartPre=/bin/mkdir -p /run/clamav (code=exited, status=0/SUCCESS)
    Process: 54280 ExecStartPre=/bin/chown clamav /run/clamav (code=exited, status=0/SUCCESS)
   Main PID: 54281 (clamd)
      Tasks: 1 (limit: 18920)
     Memory: 955.7M
        CPU: 4.215s
     CGroup: /system.slice/clamav-daemon.service
             └─54281 /usr/sbin/clamd --foreground=true

今度はOKです。この結果を見てもわかるように、消費メモリが1GBほど。

  • ソケットがリッスンされていることを確認
netstat -a|grep clam
unix  2      [ ACC ]     STREAM     LISTENING     1516341  /var/run/clamav/clamd.ctl

freshclamを定期実行させます。

  • サービススクリプトを作成
cat <<- __EOF__ | sudo tee -a /etc/systemd/system/freshclam.service
[Unit]
Description=Freshclam virus database updater

[Service]
Type=simple
ExecStart=/usr/bin/freshclam -d -c 4
# -c 数字で 頻度を指定します。ここでは日に4回(6時間おき)に更新します

[Install]
WantedBy=multi-user.target
__EOF__
  • 実行権付与
sudo chmod +x /etc/systemd/system/freshclam.service
  • サービス反映
sudo systemctl daemon-reload
  • サービス開始
sudo systemctl start freshclam.service
  • 自動起動有効化
sudo systemctl enable freshclam.service
  • サービス開始確認
systemctl status freshclam.service

Active :inactive (dead)と表示されますが、 freshclam.service: Deactivated successfully.と出ていれば動作に問題はありません。

NextcloudでAntiVirusをインストール

  1. Nextcloudに管理者権限でログインします。
  2. アプリから「Antivirus for files」を検索してインストールします。

Nextcloud Antivirus for files設定

  1. 管理者メニューの「セキュリティ」に進みます。
  2. ファイルのウイルス対策で、以下の通り設定します。
  • モード: ClamAV Daemon (Socket)
  • ソケット: /var/run/clamav/clamd.ctl
  • ストリームの長さ: 262144000 (アップロードできるファイルの容量に合わせます)
  • File size limit for periodic background scans and chunked uploads, -1 means no limit:-1
  • Check only first bytes of the file, -1 means no limit :-1
  • バックグラウンドスキャン中に感染ファイルが見つかった場合: ログのみ (運用に合わせます)

設定後、「保存」をクリックして、設定完了です。

Ubuntu 22.04にclamavを設定。(インストールと動作確認)

Ubuntu 22.04の検証機が、16GBほどの余裕があったのでclamavをインストールしてみます。

さっくりとした手順

  1. レポジトリを追加します。
  2. clamavをインストールします。
  3. 定義ファイルをアップデートします。
  4. 動作を確認します。

手順

レポジトリを追加します。

sudo add-apt-repository ppa:deadsnakes/ppa

clamavのインストールを行います。

  • パッケージ更新
sudo aptitude update
  • clamavインストール
sudo aptitude install clamav clamav-daemon
  • インストール確認
clamd --version

2024/02/20現在、以下を確認しました。

ClamAV 0.103.11/27190/Mon Feb 19 18:24:27 2024

定義ファイルの更新を行います。

  • freshclam 起動(失敗)
sudo freshclam 

以下のエラーが出ました。

ERROR: /var/log/clamav/freshclam.log is locked by another process
ERROR: Problem with internal logger (UpdateLogFile = /var/log/clamav/freshclam.log).
ERROR: initialize: libfreshclam init failed.
  • エラー対処
sudo rm /var/log/clamav/freshclam.log
  • エラー対処後のfreshclam 起動(OK)
sudo freshclam

定義ファイル更新確認

Tue Feb 20 15:35:41 2024 -> ClamAV update process started at Tue Feb 20 15:35:41 2024
Tue Feb 20 15:35:41 2024 -> daily.cvd database is up-to-date (version: 27190, sigs: 2053641, f-level: 90, builder: raynman)
Tue Feb 20 15:35:41 2024 -> main.cvd database is up-to-date (version: 62, sigs: 6647427, f-level: 90, builder: sigmgr)
Tue Feb 20 15:35:41 2024 -> bytecode.cvd database is up-to-date (version: 334, sigs: 91, f-level: 90, builder: anvilleg)

インストール後のステータスを確認します。

systemctl status clamav-daemon
systemctl status clamav-freshclam

それぞれactive(running)を確認します

テストファイルを用いて動作を確認します。

  • ディレクトリ移動
cd /hoge && pwd

任意のディレクトリを指定してください。

  • eicarテストファイル作成
echo "X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*" > eicar
  • ディレクトリスキャン
clamscan ./

以下を確認したら、スキャンはできています。

/hoge/eicar: Eicar-Signature FOUND

----------- SCAN SUMMARY -----------
Known viruses: 8685351
Engine version: 0.103.11
Scanned directories: 1
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 16.689 sec (0 m 16 s)
Start Date: 2024:02:20 16:12:15
End Date:   2024:02:20 16:12:32

これから

  1. 設定ファイルを編集
  2. ファイル追加時などにスキャンをするようにする

などを行っていきます。

対話式にLinuxサーバの再起動・停止を行うシェルスクリプト。

概要

メンテナンスなどで、指定する時刻にLinuxサーバを停止・再起動したいときは割合にあります。

そこで、そんなスクリプトです。

スクリプト内容

  • server_shutdown.sh
#!/bin/bash

# メッセージを表示して日付を入力
read -p "このサーバを停止・再起動する日付をyyyymmdd形式で入力してください: " input_date

# メッセージを表示して時刻を入力
read -p "このサーバを停止・再起動する時刻をhhmm形式で入力してください: " input_time

# メッセージを表示して再起動か停止かを入力
read -p "再起動は1、停止は2を入力してください(空エンターは1): " restart_option
restart_option=${restart_option:-1}  # デフォルトは再起動(1)

# 日付と時刻を結合
scheduled_datetime="${input_date} ${input_time}"

# オプションに応じてコマンドを設定
case $restart_option in
    1)
        action="再起動"
        ;;
    2)
        action="システム停止"
        ;;
    *)
        echo "無効なオプションが選択されました。スクリプトを終了します。"
        exit 1
        ;;
esac

# 確認メッセージを表示して、実行の可否を確認
read -p "$(date -d "$scheduled_datetime" '+%Y/%m/%d %H:%M') に$action します。よろしいですか?(y/n): " confirmation

if [ "$confirmation" == "y" ]; then
    # 指定した日時まで待機し、処理をバックグラウンドで実行
    (sleep $(( $(date -d "$scheduled_datetime" '+%s') - $(date '+%s') )) && {
        echo "システムに常駐し、指定日時に$action を行います。"
        if [ $restart_option -eq 1 ]; then
            shutdown -r now
        elif [ $restart_option -eq 2 ]; then
            shutdown -h now
        fi
    }) &
    disown  # バックグラウンドプロセスをデタッチ
    echo "処理をバックグラウンドで実行しました。プロンプトに戻ります。"
else
    echo "操作をキャンセルしました。"
fi

作成後、

sudo chown root:root server_shutdown.sh

として所有者をrootに変更。その後、

sudo chmod 744 server_shutdown.sh

で、rootのみに実行権を付与します。

実行時の動き

sudo bash server_shutdown.sh
このサーバを停止・再起動する日付をyyyymmdd形式で入力してください: 20240216
このサーバを停止・再起動する時刻をhhmm形式で入力してください: 0215
再起動は1、停止は2を入力してください(空エンターは1): 1
2024/02/16 02:15 に再起動 します。よろしいですか?(y/n): y
処理をバックグラウンドで実行しました。プロンプトに戻ります。

と、プロンプトが出て指定時刻にサーバーの再起動/停止を行います。

動きを止めたいとき

バックグラウンドで処理が走っているので、プロセスを確認して止めます。

  • プロセス確認
ps aux |grep server_shutdown
root        2202  0.0  0.0  11020  1528 ?        S    16:32   0:00 bash server_shutdown.sh

2202のように、PIDを確認します。

  • プロセス停止
sudo kill 2202

PIDに停止シグナルを送り、処理を止めます。

  • プロセス確認
ps aux |grep server_shutdown

該当するバックグラウンドの処理がなければ大丈夫です。

Page 10 of 24

Powered by WordPress & Theme by Anders Norén