20220323のLinuxに関する記事は7件です。

PostgreSQLを調査するときのメモ

PostgreSQLでトラブル起きた時、何をするんだっけ? 何をするか毎回忘れてあたふたするので、備忘録として。 そもそもDBが何セッション許容しているか調べる時 SHOW max_connections; postgresql.conf max_connections = 100 # (change requires restart) 現在のセッションの接続数は? SELECT COUNT(*) FROM pg_stat_activity; セッションが一杯になっていないか確認できる。 その他にも色々調査できそう。 postgres=# \d pg_stat_activity; datid | oid | | | datname | name | | | pid | integer | | | usesysid | oid | | | usename | name | | | application_name | text | | | client_addr | inet | | | client_hostname | text | | | client_port | integer | | | backend_start | timestamp with time zone | | | xact_start | timestamp with time zone | | | query_start | timestamp with time zone | | | state_change | timestamp with time zone | | | wait_event_type | text | | | wait_event | text | | | state | text | | | backend_xid | xid | | | backend_xmin | xid | | | query | text | | | backend_type | text | | | 以下でトランザクションの調査ができる postgres=# select datname, usename, state, query from pg_stat_activity; postgres=# select procpid, datname, client_addr from pg_stat_activity where datname = '{DB名}'; postgresql.conf変更した際に再起動必要か確認 postgres=# select name, setting, context from pg_settings;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Let's Encryptの自動更新結果をIncoming Webhookを利用してSlackに通知する

概要 ・スクリプトを用いてLet's Encryptの自動更新をさせます。 ・Incoming Webhook を利用して、自動更新の結果をSlackに通知させます。 ・Let's Encryptの設定については終わっているものとします。 Webhook URLの取得 以下にアクセス https://slack.com/services/new/incoming-webhook チャンネル選択 通知したいチャンネルを選択して追加 Webhook URLの確認 スクリプト例 sslcheck.sh #!/bin/bash #更新前確認 ssl_check1=$(curl -v https://hogehoge.jp/ 3> /dev/null 2>&1 1>&3 | grep 'subject:' | cut -b 13-50) ssl_check2=$(curl -v https://hogehoge.jp/ 3> /dev/null 2>&1 1>&3 | grep 'expire date:' | cut -b 17-50) #変換 date1=$ssl_check2 if [[ $date1 == *GMT* ]]; then rename_date1=`echo $date1 | sed -e 's/ GMT//g'` else rename_date1=$date1 fi result_date1=`date -d "$rename_date1" "+%Y/%m/%d %T"` #更新 sudo systemctl stop httpd sudo certbot renew > /dev/null 2>&1 sudo systemctl start httpd #更新後確認 ssl_check3=$(curl -v https://hogehoge.jp/ 3> /dev/null 2>&1 1>&3 | grep 'expire date:' | cut -b 17-50) #変換 date2=$ssl_check3 if [[ $date2 == *GMT* ]]; then rename_date2=`echo $date2 | sed -e 's/ GMT//g'` else rename_date2=$date2 fi result_date2=`date -d "$rename_date2" "+%Y/%m/%d %T"` #比較 if [[ $result_date1 < $result_date2 ]]; then echo -e "ドメイン:\n$ssl_check1" "\n更新前:\n$ssl_check2" "\n更新後:\n$ssl_check3" "\n結果:\n更新完了" | /root/webhook.sh else echo -e "ドメイン:\n$ssl_check1" "\n更新前:\n$ssl_check2" "\n更新後:\n$ssl_check3" "\n結果:\n更新失敗" | /root/webhook.sh fi webhook.sh 以下参考にさせて頂きました。通知先のWebhook URLやチャンネル名は適宜変更ください。 参考文献: [10分で出来る]シェルスクリプトの結果をslackに投稿 メンション付きで通知させたい場合もあると思います。 メンション付で通知させたい場合は、Webhook送信部分を以下のように変更します。 @hereの場合 curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"text\": \"<!here>${WEBMESSAGE}\" }" ${WEBHOOKURL} >/dev/null メンバーの場合 curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"text\": \"<@メンバーID>${WEBMESSAGE}\" }" ${WEBHOOKURL} >/dev/null ユーザグループの場合 curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"text\": \"<!subteam^ユーザグループID|ユーザグループID名>${WEBMESSAGE}\" }" ${WEBHOOKURL} >/dev/null メンバーIDの確認は、Slackのプロフィールから確認できます。 ユーザグループIDの確認は、ブラウザ版のSlackから確認したいユーザグループのメンションがあるところで右クリック → 検証から確認できます。 実行結果 メンションは付けていません。 Let’s Encryptのサーバ証明書は有効期限の30日前から更新が可能らしいので、有効期限に合わせてcronを設定するのがよさそうです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

crontabの基本的なコマンドとファイル差替え(Windows)

事前事項 差替え用のcronファイル(cron_batch.cron.new)は既に用意済み。 ファイル名、ディレクトリ構造は適当に記載している。 差替え手順 FTPソフト(WinSCP等)を使用して、バッチサーバーの「/tmp」にcronファイルを格納する。 SSHクライアント(Putty等)を使用して、「踏み台サーバー」→「バッチサーバー」の順に接続する。 root(スーパーユーザー)に切り替える。 sudo su - tmpディレクトリへ移動する。 cd /tmp 変更前のcrontabを「tmpディレクトリ」へバックアップをとる。 crontab -l > crontab_backup1 差替え用のファイルを反映させる。 crontab /tmp/cron_batch.cron.new 変更後のcronファイルのバックアップをとる。 crontab -l > crontab_backup2 変更前後の差分を確認する。 diff crontab_backup1 crontab_backup2 バックアップディレクトリの作成 mkdir -p /home/backup/`date +%Y%m%d` crontab出力ファイルをローカルのバックアップディレクトリに退避する。 mv /tmp/crontab_backup? /home/backup/`date +%Y%m%d` 退避ファイルを確認する。 ls -l /home/backup/`date +%Y%m%d` ログアウト exit 基本的なcrontabコマンド コマンド 内 容 crontab ファイル名 cronファイルの更新(ファイル名を指定しないと、空ファイルを指定したことになり、cronファイルが消えるので注意が必要。 ) crontab -l cron設定の表示 (「crontab -l > ファイル名」で表示した内容を別ファイルに保存。 ) crontab -e cronファイルの編集 (「e」の隣に「r」があるので、使用する際は注意が必要。) crontab -r cronファイルの削除(警告なしで削除される。)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mdadmでRAIDデバイスを作成する

LinuxでUSB外付けハードディスクを4台使ってRAID6デバイスを作成する手順 前提 RAIDデバイスを作成する場合、すべてのディスクがほぼ同じ転送速度でないと、ボトルネックになるデバイスが発生する可能性があるので、理想はすべて同一モデル、回転数、容量のものを選びます。それが難しい場合でも最低でも容量が同一でないと無駄になるエリアが発生することに注意が必要です。 ハードディスクの収納されているケース内で最も熱がたまり易い部位に存在するディスクから壊れる傾向があるため、例えば4台で内側の1台が壊れた場合には内側のもう一台も故障の時期が近い恐れがあります。 RAID5の場合1台までの故障はカバーされますが、2台同時に故障してしまうとデータが消失してしまうことになり、RAID6ではその点がカバーされ、2台同時に故障しても回復することが可能になっています。ただしその分パリティエリアのサイズが大きくなるため、RAIDデバイスの容量が小さくなってしまうという点がデメリットとして生じます。 RAID5/RAID6デバイスはハードディスク1台に比べてパフォーマンスや信頼性に優れはしますが、バックアップについて事前にしっかりと計画しておくことが重要です。 mdadmをインストールします ubuntu/debian系 sudo apt install mdadm Redhat系 sudo yum install mdadm md デバイスを作成します sudo mdadm --create /dev/md/md0 --level=raid6 --raid-devices=4 --verbose /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 コマンドの実行後RAIDデバイスの構築が行われるため、すべてのディスクへのI/Oがしばらく発生します。ディスク容量や構成にもよりますが、それなりに時間がかかります。 マウント sudo mount /mnt/raid /dev/md0 ステータス確認 sudo mdadm --detail /dev/md0 デバイスをfailステータスへ変更する デバイスをremoveするために、事前にfailステータスへ変更する sudo mdadm --fail /dev/md0 /dev/sdc1 デバイスのadd sudo mdadm --add /dev/md0 /dev/sdg1 デバイスのremove busy状態のデバイスはremoveできないので注意 sudo mdadm --remove /dev/md0 /dev/sdg1 注意点 USBデバイスはかんたんに着脱が可能であるため、動作中のRAIDデバイスに使用されているHDDを誤ってdisconnectしてしまうと、Rebuild処理が走るだけでなく、RAID5なら1つ、RAID6なら2つまでのデバイスの切断までは大丈夫ですが、それ以上のデバイスが切断されてしまうとデータを消失しますので、よく注意してください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

対象ファイルのリストを読み込んでrsyncする

やりたいこと 例えばこんなディレクトリがあったとする。 parent/ ├── child1 │ ├── grandchild1 │ └── grandchild2 └── child2 ├── grandchild1 └── grandchild2 このうち parent/ ├── child1 │ └── grandchild1 └── child2 └── grandchild2 だけを取り出したい。 やり方 rsyncしたい対象のファイルが書かれたリストを用意する parent/child1/grandchild1 parent/child2/grandchild2 --files-from=[ファイルリストの絶対パス]を使ってrsync rsync --files-from=PATH_TO_FILE SOURCE DESTINATION ファイルの中身はSOURCEからの相対パスになることに注意。例えばparentがカレントディレクトリの直下にある場合はこうなる rsync --files-from=file_list.txt . destination # 結果 destination/ └── parent ├── child1 │ └── grandchild1 └── child2 └── grandchild2
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

対象ファイルのリストが書かれたファイルを読み込んでrsyncする

やりたいこと 例えばこんなディレクトリがあったとする。 parent/ ├── child1 │ ├── grandchild1 │ └── grandchild2 └── child2 ├── grandchild1 └── grandchild2 このうち parent/ ├── child1 │ └── grandchild1 └── child2 └── grandchild2 だけを取り出したい。 やり方 rsyncしたい対象のファイルが書かれたリストを用意する parent/child1/grandchild1 parent/child2/grandchild2 --files-from=[ファイルリストの絶対パス]を使ってrsync rsync --files-from=PATH_TO_FILE SOURCE DESTINATION ファイルの中身はSOURCEからの相対パスになることに注意。例えばparentがカレントディレクトリの直下にある場合はこうなる rsync --files-from=file_list.txt . destination # 結果 destination/ └── parent ├── child1 │ └── grandchild1 └── child2 └── grandchild2
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linuxでお手軽に負荷(CPU/メモリ)をかける方法

注)気合と根性の手動での負荷掛けチャレンジです。 むしろ、監視設計時に使う手法です。 今日の目標 サーバー構築後、Linuxのリソースの負荷試験を実施する際にLinuxの標準機能だけで負荷を発生させる簡単な方法を学ぶ CPU負荷を手軽にかける 一般的に知られている「stress」といったツールを使って・・・、といった方法ではなく、Linux標準コマンドで出来る方法が良いな~ 本番環境とかだと気軽ツールとかインストール出来ないので。 なるべく環境には手を加えない方法をピックアップしてみました。 yesコマンドを使う yesコマンドはOS標準で入っているビルトインコマンドです。 このyesコマンドを連打することによってCPU負荷をかける方法になります。 yesコマンドで処理をかける # yes > /dev/null リダイレクトの向きに気を付けてください。 処理を停止させる場合は「Ctrl + C」になります。 1個だとたいした負荷はかからないので、ターミナルを複数立ち上げでyesコマンド連打もアリ。 # yes > /dev/null & # yes > /dev/null & # yes > /dev/null & # yes > /dev/null & # yes > /dev/null & 停止させる場合は「jobs」で確認し、 # jobs [1] 実行中 yes > /dev/null & [2] 実行中 yes > /dev/null & [3] 実行中 yes > /dev/null & [4] 実行中 yes > /dev/null & [5] 実行中 yes > /dev/null & [6]- 実行中 yes > /dev/null & [7]+ 実行中 yes > /dev/null & 以下のような感じで停止させる # kill %1 %2 %3 [1] 終了しました yes > /dev/null [2]- 終了しました yes > /dev/null [3]+ 終了しました yes > /dev/null opensslコマンドを使う opensslコマンドでCPUのクロック数に合わせてCPU負荷をかけます。 opensslコマンド処理実行例 [root@localhost ~]# openssl speed -multi `grep processor /proc/cpuinfo|wc -l` Forked child 0 +DT:md2:3:16 +R:256480:md2:3.000000 +DT:md2:3:64 +R:133412:md2:3.000000 +DT:md2:3:256 +R:94141:md2:3.000000 +DT:md2:3:1024 +R:26955:md2:3.000000 +DT:md2:3:8192 +R:3545:md2:3.000000 +DT:md4:3:16 +R:16046421:md4:3.000000 +DT:md4:3:64 opensslコマンドでの処理を停止させる場合は「Ctrl + C」 メモリ 負荷を発生させる方法 ダミーのシェルスクリプトを作成する。 # vi test-memory.sh Enterを押下する毎に500MB分のメモリを消費する処理を以下のように記述 #! /bin/bash # "--bytest 5000000" is 500MB. echo PID=$$ echo -n "[ Enter : powerup! ] , [ Ctrl+d : stop ]" c=0 while read byte; do eval a$c'=$(head --bytes 5000000 /dev/zero |cat -v)' c=$(($c+1)) echo -n ">" done echo 作成したスクリプトを実行します。 # chmod +x test-memory.sh # ./test-memory.sh Enterを押下する毎に500MB分のメモリを消費します。 停止したい時は、Ctrl + d を押してください。 上に挙げた以外にも、CPU負荷をかける方法はたくさんあると思いますが、ある程度考えてやらないと環境そのものを壊してしまう可能性も考えられるので、その点は注意しましょう!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む