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

termuxアプリでlinux

アンドロイドアプリtermuxを使うとlinuxコマンドが打てるので使ってみた。
まず最初にこれ打っておくと使いやすくなる。
termux-setup-storage

□できたこと
・apt get update
・apt get upgrade
・pip install --upgrade pip
・pip install pandas
・pip install numpy
・pip install matplotlib
□できなかったこと
・pip install tkinter
下記が参考になる。
https://www.google.com/amp/s/www.lisz-works.com/entry/termux-init%3famp=1

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Synology DSMのタスクスケジューラーでpython実行時に起こるインポートエラーの回避方法

起こったエラー

Synology の DS118 内にあるPythonのスクリプトを、DSM のタスクスケジューラーから実行しようとしたところ、モジュールのインポートエラーが起きました。

DSMから届いたメールに記載されたエラー
Traceback (most recent call last):
  File "hoge.py", line 1, in <module>
    import tweepy
ModuleNotFoundError: No module named 'tweepy'

おかしいぞ?
SSH接続ではできるのに。。

しかもこれ、以前requestsでも同様のエラーに遭ってしまいましたが、その時はそれほどタスクスケジューラーでやる必要性がなかったことから、放置していました。
ですが今回はタスクスケジューラーでやる必要があったので、本腰を入れて対処してみることに。

分からないなりに調べると、パスが通ってない感じに思え。
おそらく、SSHで実行するのとタスクスケジューラーで実行するのと、微妙に異なるのでしょう。

というわけで、以下の通り対処してみました。

なお、pythonはパッケージセンターからインストールしてあってバージョンは3.8.2、SDKのバージョンはDSM 6.2.3-25426 Update 3です。

パスの確認

SSH接続とタスクスケジューラーの各々から、以下のコードを実行してパスのリストに差があるか確認します。

check_module_path.py
import sys

path_list = sys.path
with open('/your_storage/your_directory/check_module_path.txt', 'w', encoding='utf-8') as f:
    for path in path_list:
        f.write(path + '\n')

SSH接続から実行した場合

SSH接続から実行した場合のパス
/my_storage/my_directory
/var/packages/py3k/target/usr/local/lib/python38.zip
/var/packages/py3k/target/usr/local/lib/python3.8
/var/packages/py3k/target/usr/local/lib/python3.8/lib-dynload
/var/services/homes/synology_user_name/.local/lib/python3.8/site-packages
/var/packages/py3k/target/usr/local/lib/python3.8/site-packages
/usr/lib/python3/site-packages

タスクスケジューラーから実行した場合

タスクスケジューラーから実行した場合のパス
/my_storage/my_directory
/var/packages/py3k/target/usr/local/lib/python38.zip
/var/packages/py3k/target/usr/local/lib/python3.8
/var/packages/py3k/target/usr/local/lib/python3.8/lib-dynload
/var/packages/py3k/target/usr/local/lib/python3.8/site-packages
/usr/lib/python3/site-packages

う~~ん、、/var/services/homes/synology_user_name/.local/lib/python3.8/site-packagesが、SSH接続にはあってタスクスケジューラーにはないですね。
ここにtweepyrequestsのモジュールがいそうですので、SSH接続からこのディレクトリ内をls -lで確認してみます。

ls -l /var/services/homes/synology_user_name/.local/lib/python3.8/site-packages
# 略(多数)
# drwxrwxrwx+  3 synology_user_name users   4096 Jan 14 05:57 tweepy
# 略(多数)

tweepyありました!
もちろん、requestsもありました!

対処方法

対処方法は、二つあります。

一つ目は、スクリプト内に2行ほどコードを加える方法で、こちらの方が簡単。
もちろん私は、迷ったら簡単な方を選ぶ怠惰なやつです。。

二つ目は、タスクスケジューラーからデフォルトのパスを通す方法。
おそらくこちらで対処すべきなんでしょうけど、私のレベルではやり方が分からず。。
でも、とりあえず書くだけ書いておきます。

スクリプト内で対処する方法

以下のコードを、モジュールのimport文の前に記述します。

モジュールのimport文の前に記述!
import sys
sys.path.append('/var/services/homes/synology_user_name/.local/lib/python3.8/site-packages')

これだけで、エラー回避ができます!
分かると簡単なのですが、分かるまでが大変ですよね、こいういうのって。

タスクスケジューラーからデフォルトのパスを通す方法

パスを通すには、~/.bashrcからvi等のエディタで以下を追記すればいいのかもなのですが、これをタスクスケジューラー上でやるのってどうすればいいのか分からず。。

export PATH=$PATH:"/var/services/homes/synology_user_name/.local/lib/python3.8/site-packages"

タスクスケジューラーのスクリプトの中で、viってできるんですかね??
ご存じの方いらっしゃいましたら、ご教示いただけますとありがたいですm(_ _)m

参考

Pythonでimportの対象ディレクトリのパスを確認・追加(sys.pathなど) | note.nkmk.me
【Python環境構築】環境変数について解説! | WEBCAMP NAVI
pythonのパッケージの保存場所 - Qiita
Python内のデフォルトパスを通す方法(Windows, Linux) - Qiita

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

サーバー移管に伴う、Let's Encryptにて発行したSSL証明書の使い回しをしてみた

前提

今回サーバーA(以降、旧サーバー)からサーバーB(以降、新サーバー)へお引っ越しをする機会があり、
旧サーバーで使用していたSSL証明書を、新サーバーへ持っていきそのまま使用したかったため、以下を参考にやってみた。
以下手順であれば一瞬でもSSL化が解除されることはなくなり、安心・安全にサーバー移管可能かと思う。

https://blog.fileshelfplus.com/vps/280

環境

  • conoha VPS → conoha VPS
  • お名前.comにて発行したドメイン(そのまま・IPアドレスの紐付けだけ変更)
  • centos7 → centos7

手順

まずは旧サーバーへsshログイン
(基本的に Let's Encrypt にて発行した証明書は、/etc/letsencrypt/にある。)
letsencryptディレクトリ丸ごと圧縮する。

旧サーバー
$ zip -ry letsencrypt.zip /etc/letsencrypt
# または
$ tar zcvf letsencrypt.tar.gz /etc/letsencrypt

圧縮したファイルを新サーバーへリストア後、sshログイン。

Let’s Encrypt ユーザーガイドに従ってCertbotクライアントをインストールする。

新サーバー
$ sudo yum -y install epel-release
$ sudo yum -y install certbot
$ sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
$ sudo chmod 700 /usr/bin/certbot-auto

次にリストアした圧縮ファイルを解凍する。
解凍場所は/etc

新サーバー
$ zip -ry letsencrypt.zip /etc/letsencrypt
# または
$ tar zcvf letsencrypt.tar.gz /etc/letsencrypt

ドメインのIP紐付け変更

ここまで出来たらドメインの付け替えを実施。
各種サーバー会社の手順に従い、AレコードやTXTレコード、ネームサーバーの変更を行う。
今回は以下を参考にした。

https://qiita.com/sugra511/items/3b05423d4adeeec5cdd4

最後に証明書の更新を実施しwebサーバーを更新。

新サーバー
$ certbot-auto renew
$ systemctl restart httpd

※必要に応じてcronにて証明書の自動更新設定をしておく。

# 以下は、毎月1日の午前4時に自動更新をするcron
# certbot-auto で証明書を更新し、apacheを再起動
# [webroot]の設定を忘れないこと

$ crontab -e
00 04 01 * * certbot-auto renew --force-renew --webroot-path /var/www/html/[webroot] --post-hook "systemctl reload httpd"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux ファイルのパーミッション

パーミッションとは

このファイルまたはディレクトリに対して、

  • どのユーザーが
  • どういった操作ができるか

といった権限のことです。

見方

# 例
$ ls -la
-rwxr-xr-x 1 root root ...

パーミッションは9つの文字列で表され、先頭から3文字区切り(rwx/r-x/r-x)
でぞれぞれ意味を成します。
具体的には、

  • 1~3文字(rwx) -> ファイル所有者の権限
  • 4~6文字(r-x) -> 同グループに所属しているユーザーに対する権限
  • 7~9文字(r-x) -> それ以外のユーザーに対しての権限

といった意味があります。
ちなみに一番最初にある-はファイルを指し、dであればディレクトリ、lであればシンボリックリンクを意味します。

$ ll
# ファイル
-rwxr-xr-x 1 root root ...
# ディレクトリ
drwxr-xr-x 1 root root ...
# シンボリックリンク
lrwxr-xr-x 1 root root ...

各文字の意味

r -> Read 読み取り権限
w -> Write 書き込み権限
x -> Execute 実行権限
- -> 権限なし

改めて最初の例を見てみる

# 例
$ ls -la
-rwxr-xr-x 1 root root ...

各文字の意味を理解したところで、最初の例を改めて見てみると以下のような意味になります。

  • rwx(ファイル所有者の権限) -> 読み取り権限、書き込み権限、実行権限全て持っている
  • r-x(同グループに所属しているユーザーに対する権限) -> 書き込み権限はないが、読み取り権限と実行権限を持っている
  • r-x(それ以外のユーザーに対しての権限) -> 書き込み権限はないが、読み取り権限と実行権限を持っている

数値で表す

権限を変更する際には権限を数値で指定します。

# 例
$ chmod 777 hoge.txt

早速ですが以下が数値と権限の対応表です。

数値 2進数 権限
0 000 ---
1 001 --x
2 010 -w-
3 011 -wx
4 100 r--
5 101 r-x
6 110 rw-
7 111 rwx

数値と権限だけだと覚えにくいので2進数も載せています。
2進数でみると、
0が権限なしの-
1が権限あり
となり、数値で見るよりもわかりやすいです。

そして、この表を見ながら例を見てみると

$ chmod 777 hoge.txt

777( = rwxrwxrwx)となるので
全てのユーザーに全ての操作(読み取り、書き込み、実行)ができるようにするといった意味になります。

最後に

インフラ担当でもない限り、普段のエンジニアリングでファイル権限を操作することってあまりないと思います。
ですがDockerとか触っているとファイル権限によって意図しないエラーが出たりすることも。。。
で、 rw-r--r--ってどういう意味だったっけ??となりがちですよね(主に私ですが)。
そういった時に少しでもお役に立てれば幸いです。

最後まで読んでいただきありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CloudWatchにロードアベレージを追加する

背景

CloudWatchを使用しEC2のロードアベレージの監視をしようとしたが現状ロードアベレージのメトリクスは標準で用意されていないので自分でカスタムを作成しないといけないとのこと。。。

なので面倒くさいが自分でスクリプトを書いてCloudWatchから監視できるようにしました!

ロードアベレージとは

ロードアベレージはシステム全体の負荷状況を表す指標であり
1CPUにおける単位時間あたりの実行待ちとディスクI/O待ちのプロセスの数で表される。

簡単にまとめるとコンピューターシステムが実行している作業量のことです。

さっそく

■まずEC2にCloudWatchAgentServerPolicyのロールを作成しアタッチする。
sshログインをして

$ vi /home/ec2-user/loadaverage.sh

#!/bin/bash

## AWS CLI設定
readonly AWS_CLI="/usr/bin/aws"
readonly AWS_CLI_REGION="ap-northeast-1"

## メトリックス名と単位の設定
metric_name="LoadAverage-EC2"
name_space="AmazonLinux/${metric_name}"
unit="Percent"
#unit="Count"

## ロードアベレージを取得する自分の環境に合わす
## uptimeコマンドで出てくる最初の数字を取得できるように変える(10~12くらい?)
load_average=`uptime | tr -s ' ' | cut -d ' ' -f 11 | cut -d ',' -f 1`


## AWS CloudWatchのカスタムメトリクスにロードアベレージを追加する
${AWS_CLI} cloudwatch --region ${AWS_CLI_REGION} put-metric-data --metric-name `hostname -s`/${metric_name} --namespace ${name_space} --value ${load_average} --unit ${unit}

:wq
■権限付与
$ chmod 755 /home/ec2-user/loadaverage.sh

■cloudwatchへメトリクス送信
$ /home/ec2-user/loadaverage.sh

■EC2インスタンスのロードアベレージをCloudWatchに5分おきに記録する
$ crontab -e
*/5 * * * * /home/ec2-user/loadaverage.sh

これで完成です??
スクリーンショット 2021-01-16 14.56.13.png

参考記事

https://qiita.com/na0AaooQ/items/1fedb1d0136cd78c6aa1
https://qiita.com/ryuichi1208/items/3b21aee6c38bcfdb12b1

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux【シェルコマンド】

はじめに

これは学習用のメモになります。
今回はよく使うシェルコマンド(ショートカットキー)を学習していきます。

カーソル移動

コマンド 内容
Ctrl+f 1文字次へ移動
Ctrl+b 1文字前へ移動
Ctrl+a 行の先頭に移動
Ctrl+e 行の最後に移動
Meta+f(esc+f) 一単語次へ移動
Meta+b(esc+b) 一単語前へ移動

文字列の編集

コマンド 内容
Ctrl+h カーソルの左1文字削除
Ctrl+d カーソル部分を1文字削除
Ctrl+w カーソル位置の単語を削除(カーソルの前の部分)
Ctrl+u カーソルの位置から行頭まで削除
Ctrl+k カーソルの位置から行末まで削除
Ctrl+y 最後に削除した内容を挿入

トラブル時の対応

コマンド 内容
Ctrl+c 実行中のコマンドを強制終了
Ctrl+l 画面の消去。文字化けしたときのクリアにも使える
Ctrl+s 画面表示のロック(キーボードから文字の入力を受け付けない)
Ctrl+q 画面表示のロックを解除

補完・コマンド履歴

コマンド 内容
Tab コマンドやパスの補完
Ctrl+p、または↑キー 一つ前の履歴を見る
Ctrl+n、または↓キー 一つ後の履歴を見る
Ctrl+r コマンド履歴のインクリメンタル検索
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerのVolumeを全て削除する

docker volume ls | awk '{print $2}' | xargs docker volume rm
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む