20211015のLinuxに関する記事は6件です。

【ShellScript】rsyncコマンドを使用したバックアップシェルスクリプトを紹介!!

1 はじめに Linuxにおいてバックアップの方法は多々あります。 有名所だと、dump, dd, rsync等です。どれも使い勝手の良い便利なコマンドになります。 本記事では、その中でもオプションが豊富で様々なケースで使用できるrsync(アールシンク)コマンドを使用した指定ディレクトリのバックアップを行うシェルスクリプトを作成しましたので、使い方と一緒に紹介させていただきます。 2 概要 ● 概要 Linuxで、指定のディレクトリのバックアップを行うシェルスクリプトを作成する。 また、日次でスクリプトを実行することを想定し、差分バックアップ(ミラーリング)が可能なrsyncコマンドを使用する。 ● 機能要件 ・バックアップ方法はミラーリングを採用する ・コマンドの実行ログは別途ログファイルに出力する ● 実行環境 Linux OS 3 rsyncについて UNIXシステムにおける、差分符号化を使ってデータ転送量を最小化し、遠隔地間のファイルやディレクトリの同期を行うアプリケーションソフトウェアの1つです。 「変更があった分だけ更新する」という機能があるので、ディレクトリ単位のバックアップで特に便利に使えます。 3.1 rsyncコマンドの構文 ● rsyncコマンドの書式 rsyncコマンドの書式 rsync [オプション] [同期元] [同期先] ● rsyncコマンドのオプション 短いオプション 長いオプション 説明 -a --archive -rlptgoD と同じ -r --recursive 指定ディレクトリ配下をすべて対象とする -l --links シンボリックリンクをそのままシンボリックリンクとしてコピー -p --perms パーミッションをそのままコピー -t --times タイムスタンプをそのままコピー -g --group グループをそのままコピー -o --owner ファイル所有者をそのままコピー (root のみ有効) -D --devices --specials と同じ --devices ブロックデバイスをコピー (root のみ有効) --specials 名前付きパイプや FIFO などの特殊ファイルをコピー -H --hard-links ハードリンクをそのまま反映 -h --human-readable ファイルサイズのbytesをKやMで出力 -v --verbose コピーしたファイル名やバイト数などの転送情報を出力 -z --compress データ転送時に圧縮 --compress-level=NUM NUMがゼロでない場合 --compress オプションが暗黙的に指定される --skip-compress=LIST -c --checksum タイムスタンプとファイルサイズではなくチェックサムで差分を確認 -u --update 転送先に既にファイルが存在し、転送先のタイムスタンプの方が新しい場合は転送しない -n --dry-run コピーや転送を実際には行わず転送内容のみ出力 --delete 転送元に存在しないファイルは削除 --exclude=PATTERN 同期から除外 4 スクリプトの紹介 本スクリプトは以下GitHubにも記載していますのでよろしければそちらでもご確認ください。 https://github.com/chibiharu/Linux-Backup-System/blob/main/rsync_backup.sh 4.1 使用方法 ① バックアップ対象リストの作成 バックアップ対象ディレクトリ、ファイルを登録したバックアップ対象リストを作成します。 バックアップリストの作成 # バックアップ対象リストに/homeディレクトリを追加 $ echo "/home" >> BK_Target.conf # バックアップ対象リストに/var/logディレクトリを追加 $ echo "/var/log" >> BK_Target.conf ② スクリプトの作成 バックアップリストと同じディレクトリにスクリプトを作成します。 スクリプトの作成 # スクリプトを生成 $ touch rsync_backup.sh # スクリプトに使用権限を付与 $ chmod 777 rsync_backup.sh ③ コードの貼り付け スクリプトをvimで開き、<項番4-2>のスクリプトコードを貼り付けます。 コードの貼り付け $ vim auto_update_to_debian.sh $ cat auto_update_to_debian.sh <項番3-2>のスクリプトコード> 4.2 スクリプト 以下、本スクリプトになります。 rsync_backup.sh ##################################################################### # # <スクリプト名> # Rsyncコマンドを使用したバックアップスクリプト # # <概要> # 指定ディレクトリを他のディレクトリへコピー(ミラーリング)する # # <使用方法> # 1:BK_Target.confを本スクリプトを同ディレクトリに作成し、同期元ディレクトリ名 # をconfに追記する # 2:本スクリプトの[BK_TARGET_TO]を指定し、スクリプトを実行する # # <更新履歴> # 20211012 - 新規作成 # ##################################################################### #!/bin/bash ##################################################################### ## 事前設定 ##################################################################### # 日時取得(yyyymmdd) data=`date "+%Y%m%d"` ##################################################################### ## パラメーター設定 ※修正箇所 ##################################################################### # バックアップ先ディレクトリ BK_TARGET_TO=<バックアップ先ディレクトリのフルパスを指定> # ログファイル LOGFILE="/var/log/rsync/rsync_${data}.log" # ログディレクトリ LOGDIR="/var/log/rsync" ###################################################################### ## 必要リソースの生成 ###################################################################### # ログディレクトリの生成 if [ ! -d $LOGDIR ]; then sudo mkdir ${LOGDIR} fi # ログファイルの生成 if [ ! -e $LOGFILE ]; then sudo touch ${LOGFILE} fi # 設定ファイルの存在確認 if [ ! -e BK_Target.conf ]; then echo "[Error] not found error - <設定ファイルが見つかりません>" | sudo tee -a ${LOGFILE} echo "処理を中断します" | sudo tee -a ${LOGFILE} Exit fi ##################################################################### ## 実行前処理 ##################################################################### # ログ出力日時のフォーマットを yyyy/mm/dd hh:mm:ss に設定する start_time=$(date '+%Y/%m/%d %T') # ログ見出し出力 echo "##### $start_time Start rsync backup #####" | sudo tee -a ${LOGFILE} ##################################################################### ## バックアップ処理 ##################################################################### ### バックアップ処理 ### # 設定ファイルの読み込み while read line do # 読み込んだ設定ファイルの値を変数に代入 VAL=`eval echo $line | awk '{print $1}'` # 読み込んだディレクトリが存在するのか確認 if [ ! -e $VAL ]; then echo "[Error] not found error - <${VAL}が見つかりません>" | sudo tee -a ${LOGFILE} echo "処理を中断します" | sudo tee -a ${LOGFILE} Exit fi # 読み込んだディレクトリのミラーリング処理を行う rsync --progress -av --delete ${VAL} ${BK_TARGET_TO} | sudo tee -a ${LOGFILE} # 終了コードを取得 CODE=$? # ${CODE}が0(正常終了)でない場合の処理 if [ $CODE -ne 0 ]; then echo "[Error] script filed - <${VAL}のバックアップが失敗しました>" | sudo tee -a ${LOGFILE} echo "処理を中断します" | sudo tee -a ${LOGFILE} exit 1 fi done < BK_Target.conf ###################################################################### ## 実行後処理 ###################################################################### # ログ出力日時のフォーマットを yyyy/mm/dd hh:mm:ss に設定する end_time=$(date '+%Y/%m/%d %T') # ログ見出し出力 echo "###### $end_time End rsync backup ######" | sudo tee -a ${LOGFILE}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Shell Script】rsyncコマンドを使用したバックアップシェルスクリプトを紹介!!

1 はじめに Linuxにおいてバックアップの方法は多々あります。 有名所だと、dump, dd, rsync等です。どれも使い勝手の良い便利なコマンドになります。 本記事では、その中でもオプションが豊富で様々なケースで使用できるrsync(アールシンク)コマンドを使用した指定ディレクトリのバックアップを行うシェルスクリプトを作成しましたので、使い方と一緒に紹介させていただきます。 2 概要 ● 概要 Linuxで、指定のディレクトリのバックアップを行うシェルスクリプトを作成する。 また、日次でスクリプトを実行することを想定し、差分バックアップ(ミラーリング)が可能なrsyncコマンドを使用する。 ● 機能要件 ・バックアップ方法はミラーリングを採用する ・コマンドの実行ログは別途ログファイルに出力する ● 実行環境 Linux OS 3 rsyncについて UNIXシステムにおける、差分符号化を使ってデータ転送量を最小化し、遠隔地間のファイルやディレクトリの同期を行うアプリケーションソフトウェアの1つです。 「変更があった分だけ更新する」という機能があるので、ディレクトリ単位のバックアップで特に便利に使えます。 3.1 rsyncコマンドの構文 ● rsyncコマンドの書式 rsyncコマンドの書式 rsync [オプション] [同期元] [同期先] ● rsyncコマンドのオプション 短いオプション 長いオプション 説明 -a --archive -rlptgoD と同じ -r --recursive 指定ディレクトリ配下をすべて対象とする -l --links シンボリックリンクをそのままシンボリックリンクとしてコピー -p --perms パーミッションをそのままコピー -t --times タイムスタンプをそのままコピー -g --group グループをそのままコピー -o --owner ファイル所有者をそのままコピー (root のみ有効) -D --devices --specials と同じ --devices ブロックデバイスをコピー (root のみ有効) --specials 名前付きパイプや FIFO などの特殊ファイルをコピー -H --hard-links ハードリンクをそのまま反映 -h --human-readable ファイルサイズのbytesをKやMで出力 -v --verbose コピーしたファイル名やバイト数などの転送情報を出力 -z --compress データ転送時に圧縮 --compress-level=NUM NUMがゼロでない場合 --compress オプションが暗黙的に指定される --skip-compress=LIST -c --checksum タイムスタンプとファイルサイズではなくチェックサムで差分を確認 -u --update 転送先に既にファイルが存在し、転送先のタイムスタンプの方が新しい場合は転送しない -n --dry-run コピーや転送を実際には行わず転送内容のみ出力 --delete 転送元に存在しないファイルは削除 --exclude=PATTERN 同期から除外 4 スクリプトの紹介 本スクリプトは以下GitHubにも記載していますのでよろしければそちらでもご確認ください。 https://github.com/chibiharu/Linux-Backup-System/blob/main/rsync_backup.sh 4.1 使用方法 ① バックアップ対象リストの作成 バックアップ対象ディレクトリ、ファイルを登録したバックアップ対象リストを作成します。 バックアップリストの作成 # バックアップ対象リストに/homeディレクトリを追加 $ echo "/home" >> BK_Target.conf # バックアップ対象リストに/var/logディレクトリを追加 $ echo "/var/log" >> BK_Target.conf ② スクリプトの作成 バックアップリストと同じディレクトリにスクリプトを作成します。 スクリプトの作成 # スクリプトを生成 $ touch rsync_backup.sh # スクリプトに使用権限を付与 $ chmod 777 rsync_backup.sh ③ コードの貼り付け スクリプトをvimで開き、<項番4-2>のスクリプトコードを貼り付けます。 コードの貼り付け $ vim auto_update_to_debian.sh $ cat auto_update_to_debian.sh <項番3-2>のスクリプトコード> 4.2 スクリプト 以下、本スクリプトになります。 rsync_backup.sh ##################################################################### # # <スクリプト名> # Rsyncコマンドを使用したバックアップスクリプト # # <概要> # 指定ディレクトリを他のディレクトリへコピー(ミラーリング)する # # <使用方法> # 1:BK_Target.confを本スクリプトを同ディレクトリに作成し、同期元ディレクトリ名 # をconfに追記する # 2:本スクリプトの[BK_TARGET_TO]を指定し、スクリプトを実行する # # <更新履歴> # 20211012 - 新規作成 # ##################################################################### #!/bin/bash ##################################################################### ## 事前設定 ##################################################################### # 日時取得(yyyymmdd) data=`date "+%Y%m%d"` ##################################################################### ## パラメーター設定 ※修正箇所 ##################################################################### # バックアップ先ディレクトリ BK_TARGET_TO=<バックアップ先ディレクトリのフルパスを指定> # ログファイル LOGFILE="/var/log/rsync/rsync_${data}.log" # ログディレクトリ LOGDIR="/var/log/rsync" ###################################################################### ## 必要リソースの生成 ###################################################################### # ログディレクトリの生成 if [ ! -d $LOGDIR ]; then sudo mkdir ${LOGDIR} fi # ログファイルの生成 if [ ! -e $LOGFILE ]; then sudo touch ${LOGFILE} fi # 設定ファイルの存在確認 if [ ! -e BK_Target.conf ]; then echo "[Error] not found error - <設定ファイルが見つかりません>" | sudo tee -a ${LOGFILE} echo "処理を中断します" | sudo tee -a ${LOGFILE} Exit fi ##################################################################### ## 実行前処理 ##################################################################### # ログ出力日時のフォーマットを yyyy/mm/dd hh:mm:ss に設定する start_time=$(date '+%Y/%m/%d %T') # ログ見出し出力 echo "##### $start_time Start rsync backup #####" | sudo tee -a ${LOGFILE} ##################################################################### ## バックアップ処理 ##################################################################### ### バックアップ処理 ### # 設定ファイルの読み込み while read line do # 読み込んだ設定ファイルの値を変数に代入 VAL=`eval echo $line | awk '{print $1}'` # 読み込んだディレクトリが存在するのか確認 if [ ! -e $VAL ]; then echo "[Error] not found error - <${VAL}が見つかりません>" | sudo tee -a ${LOGFILE} echo "処理を中断します" | sudo tee -a ${LOGFILE} Exit fi # 読み込んだディレクトリのミラーリング処理を行う rsync --progress -av --delete ${VAL} ${BK_TARGET_TO} | sudo tee -a ${LOGFILE} # 終了コードを取得 CODE=$? # ${CODE}が0(正常終了)でない場合の処理 if [ $CODE -ne 0 ]; then echo "[Error] script filed - <${VAL}のバックアップが失敗しました>" | sudo tee -a ${LOGFILE} echo "処理を中断します" | sudo tee -a ${LOGFILE} exit 1 fi done < BK_Target.conf ###################################################################### ## 実行後処理 ###################################################################### # ログ出力日時のフォーマットを yyyy/mm/dd hh:mm:ss に設定する end_time=$(date '+%Y/%m/%d %T') # ログ見出し出力 echo "###### $end_time End rsync backup ######" | sudo tee -a ${LOGFILE}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Tomcat】/etc/init.d/tomcat をちょっと便利に

まえがき ・/etc/init.d/tomcat をちょっと便利にしたかった。 ・start, stop, restart, status, clean 機能 ・stop はプロセスが無くならない場合、kill する ・status は /usr/local/tomcat/webapps の状況を表示する ・clean は /usr/local/tomcat/webapps にある war とそのディレクトリを消去する (Warが無いディレクトリは削除しない&一部残す機能付き) 環境 ・CentOS 7,8 (多分他でも使える・・・気がします) ・bash ・gawk スクリプト /etc/init.d/tomcat #!/bin/bash # # tomcat This shell script takes care of starting and stopping Tomcat # # chkconfig: - 80 20 # ### BEGIN INIT INFO # Provides: tomcat # Required-Start: $network $syslog # Required-Stop: $network $syslog # Default-Start: # Default-Stop: # Short-Description: start, stop, restart, status, clean tomcat ### END INIT INFO PROGRAM=$(basename $0) TOMCAT_USER=root TOMCAT_HOME="/usr/local/tomcat" SHUTDOWN_WAIT=20 EXCEPT_WARS=() tomcat_pid() { echo `ps aux | grep org.apache.catalina.startup.Bootstrap | grep -v grep | awk '{ print $2 }'` } start() { pid=$(tomcat_pid) if [ -n "$pid" ] then echo "Tomcat is already running (pid: $pid)" else # Start tomcat echo "Starting tomcat" #/bin/su - -c "cd $TOMCAT_HOME/bin && $TOMCAT_HOME/bin/startup.sh" $TOMCAT_USER ${TOMCAT_HOME}/bin/startup.sh fi return 0 } stop() { pid=$(tomcat_pid) if [ -n "$pid" ] then echo "Stopping Tomcat" #/bin/su - -c "cd $TOMCAT_HOME/bin && $TOMCAT_HOME/bin/shutdown.sh" $TOMCAT_USER ${TOMCAT_HOME}/bin/shutdown.sh let kwait=$SHUTDOWN_WAIT count=0 count_by=5 until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ] do echo "Waiting for processes to exit. Timeout before we kill the pid: ${count}/${kwait}" sleep $count_by let count=$count+$count_by; done if [ $count -gt $kwait ]; then echo "Killing processes which didn't stop after $SHUTDOWN_WAIT seconds" kill -9 $pid fi else echo "Tomcat is not running" fi return 0 } clean() { local restart_flag=0 pid=$(tomcat_pid) if [ -n "$pid" ]; then stop restart_flag=1 fi echo "Cleaning webapps..." PWD=$(pwd) cd ${TOMCAT_HOME}/webapps if [[ $? -ne 0 ]]; then echo "webapp directory is not found. : ${TOMCAT_HOME}/webapps" exit 1 fi if [[ ${#EXCEPT_WARS[@]} -le 0 ]]; then ls -1 *.war | gawk -F "." '{ print $1; }' | xargs -I@ bash -c "rm -rf @ && rm -f @.war" else local excludes=$(IFS="|" && echo "${EXCEPT_WARS[*]}") echo "Excludes: ${excludes}" ls -1 *.war | grep -vEi "${excludes}" | gawk -F "." '{ print $1; }' | xargs -I@ bash -c "rm -rf @ && rm -f @.war" fi sleep 1 ls -l cd ${PWD} if [[ restart_flag -gt 0 ]]; then start fi } usage() { echo "${PROGRAM} (start|stop|restart|status|clean (-all|-e excludeWar,...))" echo "Ex) ${PROGRAM} start" echo "Ex) ${PROGRAM} clean -e sample,remain" exit 1 } case $1 in start) start ;; stop) stop ;; restart) stop start ;; clean) if [[ $2 == '-e' ]]; then EXCEPT_WARS=(${3//,/ }) if [[ ${#EXCEPT_WARS[@]} -le 0 ]]; then echo "Excluded wars are not set, terminated." exit 1 fi echo "Excluded wars: ${EXCEPT_WARS[@]}" elif [[ $2 == '-all' ]]; then echo "Clean all flag detected. Delete all wars." elif [[ -z $2 ]]; then echo "Clean flag is not set. Please set a flag -all or -e (excludeWar,...)." exit 1 else echo "Unknown flag, terminated.: ${2}" usage fi clean ;; status) pid=$(tomcat_pid) if [ -n "$pid" ] then echo "Tomcat is running with pid: $pid" else echo "Tomcat is not running" fi ls -l ${TOMCAT_HOME}/webapps ;; *) usage ;; esac exit 0 以上、お疲れさまでした!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自作Cコンパイラ neo-c2 version 1.1.5リリース。termuxに再対応

termuxでコンパイルが通ってませんでした。再対応
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ubuntu 21.04 から 21.10 へのアップグレードの仕方

1. まず現在の Ubuntu 21.04 を最新状態にします。 $ sudo apt update $ sudo apt upgrade $ sudo apt full-upgrade 2. 次に不要物を全消しします $ sudo apt autoremove 3. 更新の設定をします。 /etc/update-manager/release-upgrades を開いて、Promptをnormalに設定します。 # Default behavior for the release upgrader. [DEFAULT] # Default prompting behavior, valid options: # # never - Never check for a new release. # normal - Check to see if a new release is available. If more than one new # release is found, the release upgrader will attempt to upgrade to # the release that immediately succeeds the currently-running # release. # lts - Check to see if a new LTS release is available. The upgrader # will attempt to upgrade to the first LTS release available after # the currently-running one. Note that this option should not be # used if the currently-running release is not itself an LTS # release, since in that case the upgrader won't be able to # determine if a newer release is available. Prompt=normal 4. 最後に 21.10 へのアップグレードを実行します。 $ sudo do-release-upgrade いつも通り数時間、時間がかかりますので、余裕をもって作業してください。 お疲れさまでした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ターミナルコマンド一覧(よく使うもの)

初学者のための用語解説: ・ディレクトリ=Windowsでいうとフォルダ。いろいろなファイルが中に入っている。クリアファイルみたいなやつを想像するといい。 ・ファイル=Exelファイルやtextファイルなど、中身が書いてあるもの。クリアファイルに入ってる書類。 ・パス=ディレクトリのある場所。ドキュメントの中の、電子書籍フォルダの中の、鬼滅の刃フォルダの中に、鬼滅の刃2巻ファイルが入ってるみたいな感じ。 ・コマンド=パソコンへの命令。 ディレクトリの作成・削除 ディレクトリを作成 $ mkdir ディレクトリ名 ディレクトリの移動 $ cd ディレクトリ名 cdで移動してみたら今のパスを確認してみましょう。 現在置のパスを表示するコマンド。 $ pwd ディレクトリの削除 $ rm -r ファイル名 ディレクトリのコピー cp -r コピーするファイル名 新しいファイル名 現在のディレクトリのファイルを表示 ファイルやディレクトリを作成、削除したらlsコマンドで確認してみましょう。 $ ls このコマンドを使って何も表示されないときは、そこになんのフォルダもファイルも入っていないということ。 ファイルの操作 ファイルの中身を見る $ cat test.txt test.txtは例。 ファイルをコピーする $ cp コピー元のファイル名 コピー先ファイル名 ファイル名はちゃんと拡張子(ドットの後ろ)まで入れましょう。 空のファイルを作成 $ touch ファイル名 そういえばwindowsのターミナル(power shell)ではファイルの作成はtouchではなく、nulというコマンドを使うと聞いたことがある(詳しくは調べてください)。 ファイルへのテキスト記載 $ echo "記載内容" > ファイル名 ファイルがまだがない場合はエラーが返される。また、「>」でファイルへの記載を行うと前に記載された内容はすべて消されて新しく記載された内容のみとなってしまう。 $ echo "記載内容" >> ファイル名 「echo "記載内容" > ファイル名」でまっさらなところに記載するのに対して、>>はフォルダに既に記載されている内容に追記する。これだけを使ってファイルを記述することもできる。 ファイルの削除 $ rm ファイル名 ディレクトリを削除するときは「-r」オプションをつける(上述)。 ファイル名の変更 mv 変更するファイル名 変更したいファイル名 ファイルのコピー cp コピーするファイル名 新しいファイル名 もしディレクトリをコピーする場合は 「-r」オプションをつける。 ファイルの移動 mv 移動したいファイル名 移動後のディレクトリ この記事について 自分用にメモとしてまとめた。書くにあたって以下の記事からかなり引用しました。問題があったらこの記事を削除します。 Qiita"ターミナルのよく使うコマンド" あと初心者はこのサイト↓を見るといいかも。 参考資料:ターミナルの使い方
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む