それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

WSLでWindowsのパスとLinuxのパスを変換

WSLのパスを変換したい。

WindowsUbuntuのパスを相互に変換できたら、シェルスクリプトとか作るのに便利ですよね。

調べたら、できるので歓喜した

wsl wslpath PATH

WindowsLinux

WindowsのパスをWSL のLinuxのパスに変換する

C:\Users\takuya>wsl wslpath  C:/Users/takuya/Desktop/
/mnt/c/Users/takuya/Desktop/

Linuxwindows

Linux のパスをWindowsに変換する。

C:\Users\takuya>wsl wslpath -w /mnt/c/Users/takuya/Desktop/
C:\Users\takuya\Desktop

コマンドプロンプト(PS)以外

上記の例は、コマンドプロンプト( cmd.exe ) と PowerShell( PS ) で動作させているのですが。

WSLのBashの中からどうやってやるのかとなると、少しめんどくさい。

/mnt/c/windows/system32/wsl.exe wslpath -w /mnt/c

このようにして、直接指定しないとWSLのBashにはWindowsへの$PATHが通ってないので、手軽には使えない。

PATHを設定して通せばいいかというと、WSLからWindowsへのPATHをつけると色々不便なのでAliasくらいがいいのではないでしょうか。

phpで'rm -rf'で再帰的に空じゃないフォルダを消す。

php で rm -rf をする方法を探してた

PHPの組み込み機能をすごく上手につかった方法を発見したのでメモ。

<?php
function rm_rf($dir){
  $entries = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
    RecursiveIteratorIterator::CHILD_FIRST
  );
  
  foreach ($entries as $entry) {
    $func = ($entry->isDir() ? 'rmdir' : 'unlink');
    $func($entry->getRealPath());
  }
  rmdir($dir);
}

これを使うと、再帰的な削除でドットファイル再帰的な関数呼び出しも発生しない。頭いいなぁ。と思う。

RecursiveDirectoryIteratorで、ドット除去したファイル一覧を取得して、 RecursiveIteratorIterator::CHILD_FIRSTで、引数に指定されたディレクトリを最後に回す。

そうすると、foreach だけですべて削除が完成する。よく考えてある。というか RecursiveIteratorIteratorはそのためにあったんだと感心する。

以前の資料

php rmdir() で空じゃないフォルダを消すには? - それマグで!

gitlab をインストールしたらクローラー拒否を忘れずに

gitlab をインストールしたら、クローラー設定を拒否しとこう

GitLabをオンプレミスでインストールするときは、たいてい他社・他人に見られたくないレポジトリだったりするので、存在を検索に出したくないので 念の為にクローラーを切っていおくのがいいと思う。

対象ファイル。

/opt/gitlab/embedded/service/gitlab-rails/public/robots.txt
takuya@:nginx$ sudo cat /opt/gitlab/embedded/service/gitlab-rails/public/robots.txt
# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
#
# To ban all spiders from the entire site uncomment the next two lines:
User-Agent: *
Disallow: /

Windows のDHCPと固定(static)をコマンドで切り替える。

windows の netsh で dhcp と固定IPを切り替えられる。

DHCP固定IPアドレスを切り替えができるようになるので手軽に、IPをオンオフするプログラムを使わずとも、コマンドラインで完結する。

ただし、DHCPをオフにしてしまうと、DNSサーバーとデフォルトゲートウェイが変わってしまうので注意が必要。

現在の設定を確認する。

netsh interface ip show config  eth01

Configuration for interface "eth01"
    DHCP enabled:                         No ### 
 ( 略

DHCPをONの状態からオフにする。

DHCPをオフにすると、GatewayDNSも消えちゃうので、ちゃんと自分でやる必要があったので注意。

netsh interface ip set address eth01 static 192.168.11.189/24 gateway=192.168.11.1
netsh interface ip set dnsservers eth01 static 192.168.11.1 primary yes

DHCP をONにする。

IPアドレスの固定と一緒に覚えておく必要があります。

 netsh interface ip set address eth01 dhcp
 netsh interface ip set dnsservers eth01 dhcp

DNS を固定・DHCP切り替える。

DNSを固定からDHCPの経由からのオファーに切り替える。

 netsh interface ip set dnsservers eth01 dhcp

DNSDHCPオファーから、固定に切り替える

netsh interface ip set dnsservers eth01 static 192.168.11.1 primary yes

DHCPの切り替えはちょっとめんどくさいかも

わたしは、普段LinuxサーバーなどはDNSを固定で運用しているのですが、Windowsなどは完全にDHCPからのオファーを使うことにして dhcp を設定ています。

固定IPに変えるとDNSが固定になるのは、DHCPがそういうものなので仕方がないのです。

Windowsの1つのNICに複数のIPアドレスを割り当てる。

windows でも ip addr add したい。

macLinux を使っていると、 ip addr add のようなコマンドで、一つのネットワークカード(イーサネット・アダプタ)に、複数のIPアドレスを割り当てることが出来ます。

linux での例

Linux では設定を書き換えなくても、次のコマンドで手軽に、IPを追加することが出来ますよね。

ip addr add 192.168.1.10/24 dev eth1
ip addr add 192.168.2.10/24 dev eth1
ip addr add 192.168.4.10/24 dev eth1

また、IPごとにゲートウェイを変えることができるので、便利なんですが。。。

Windowsでも同じことがしたい

Windowsでも、ネットワーク・アダプタに複数のIPアドレスを割り当てたい。ネットワークを構築しているといちいち差し替えるのがだるいので、同じようなことがしたいなと思っていた。

windows 特有の制限(DHCPオフでStaticが必須・管理者)

DHCPをオンにしたままでは、複数のIPを追加できません。(やり方はあるだろうけど、netsh で単純にやるのは不可能に近いと思います。)

Linuxだと、DHCPをオンにしたままで、IPアドレスを追加することが出来ますが、Windowsでは出来ないようです。いったん、Staticに変えてあげる必要があります。

また、ネットワークの設定変更には管理者権限が必要です。

PS C:\Users\takuya> netsh interface ipv4 add address name=eth01 address=192.168.4.1 mask=255.255.255.0
The requested operation requires elevation (Run as administrator).

netshを使って、IPアドレスを複数割り当てる。

IPアドレスを、一つに複数を追加することが出来ます。

このコマンドを実行するとStatic設定になります。DHCPと共存が出来ません。

DHCP取得済みのIPアドレスデフォルトゲートウェイは削除されます。DHCPデフォルトゲートウェイと通信できなくなるので注意してください。

PS C:\WINDOWS\system32> netsh interface ipv4 add address name=アダプタ名 address=192.168.5.1 mask=255.255.255.0

管理者権限で、IPアドレスを追加する。

PS C:\WINDOWS\system32> netsh interface ipv4 add address name=eth01 address=192.168.5.1 mask=255.255.255.0

ゲートウェイを正しく設定し直す。

Staticになるので、デフォルトゲートウェイが消えちゃうので、デフォルトゲートウェイを設定し直す。

PS C:\WINDOWS\system32> netsh interface ipv4 add route 0.0.0.0./0 'my-eth01' 192.168.11.1

または

route add 0.0.0.0/0 192.168.11.1

DHCPがオフになっちゃうので結局は、ゲートウェイを設定しなくちゃいけないんですよね。Windows のネットワークのDHCPとStatic の排他処理はなんとかならないものか。

省略形

引数名を明示しなくても、順番で指定できる、またネットマスクも省略できる。

netsh interface ipv4 add address name=アダプタ名 address=192.168.5.1 mask=255.255.255.0
netsh interface ipv4 add address アダプタ名  192.168.5.2/24 

消す(利用後)

netsh interface ipv4 delete address eth01 192.168.5.2

使いにくい・・・慣れよう

linux の ip addr add みたいにアドレスを手軽に追加できないのが辛い。DHCPをオフにしてデフォルトゲートウェイゲートウェイの設定をし直ししなくちゃいけないのが辛い。

うまくメトリックを調整できればいいんだけど。

windows のdhcp と固定を 切り替える。

windows のネットワークを切り替えをコマンドプロンプトでやる。

DHCPのオンと、固定IP(static) をWindowsのコントロールパネルからポチポチ切り替えるのがめんどくさい。

マウス移動多すぎるし、コントロールパネルが「設定」に隠れて探しくくなって手間が多い。

Windowsネットワークアダプタを固定IPにする。

PS C:\WINDOWS\system32> netsh interface ipv4 set address name=eth01 static 192.168.5.100 255.255.255.0 192.168.5.1

name=名前で利用する、アダプタ名称は、netsh interface ipv4 show ineterfaces / netsh interface ipv4 show config のコマンドで事前に調べておく。

DHCP を有効にする。

PS C:\WINDOWS\system32> netsh interface ipv4 set address name=eth01 dhcp

DHCPをオンにして自動取得するようにするは、次のコマンドを使う。

set dhcp したら、即座にDHCPの取得が始まる。ipconfig renew をしなくてもいい。

name は省略可能なので、もっとシンプルに書ける。

name=XXX の部分の name は省略が可能なので、もっとシンプルに書くことが出来てわかりやすく、覚えやすくなる。

PS C:\WINDOWS\system32> netsh interface ipv4 set  address eth01 static 192.168.5.100 255.255.255.0 192.168.5.1

PS C:\WINDOWS\system32> netsh interface ipv4 set  address eth01 dhcp

これで、コマンドの窓の履歴から、矢印キーとEnterで切り替えと有効化を連続して試せるようになり、ネットワークを扱うときに格段に楽になります。

windows のネットワーク・デバイス名をnetshで変更する。

windows のネットワークのデバイス名を変更する。

netsh を使って、Windowsのアダプタ(ネットワークインタフェース)の名称を、手軽に変更することが出来ます。

C:\Users\takuya> netsh interface set interface name='旧名称' newname='新名称'

ネットワークの名称はそのままだと、日本語だったり、イーサネットXXのようなわかりにくい名前なので、xNIXライクに、ethX のような名前に変更したら便利かもしれないとおもってやってみました。ネットワークアダプタのデフォルト名称が本当にわかりにくくて、複数のLANポートを持っていると混乱するのでわかりやすい名前をつけておけばWindowsも使いやすくなるのではないでしょうか。

変更前の状態

PS C:\Users\takuya> netsh interface ipv4 show interfaces

Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 20          25        1500  disconnected  Wi-Fi
 14          25        1500  connected     イーサネット
  8          65        1500  disconnected  Bluetooth ネットワーク接続 2

変更します。

PS C:\Users\takuya> netsh interface set interface name='イーサネット' newname='eth01'

変更後の状態

PS C:\Users\takuya> netsh interface ipv4 show interfaces

Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 20          25        1500  disconnected  Wi-Fi
 14          25        1500  connected     eth01
  8          65        1500  disconnected  Bluetooth ネットワーク接続 2

ipv4 を指定しましたが、ipv6 のアダプタ名も併せて変わっています。

v6 を指定して interface 一覧を出力すると、こちらも変わっています。

PS C:\Users\takuya> netsh interface ipv6 show interfaces

Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 20          25        1500  disconnected  Wi-Fi
 14          25        1500  connected     eth01
  8          65        1500  disconnected  Bluetooth ネットワーク接続 2

コントロールパネルでも確認できます。

f:id:takuya_1st:20201025154020p:plain

netsh でインタフェースの名前を変えることが出来ました。

ただし、windowsLinuxなどとは管理体系が似ているようで異なるので、ちょっと癖があります。

とくに、netsh interface で ipv4 /ipv6 を指定するが、設定がどちらにも影響するのがちょっと不自然なコマンドな気がしますね。

windows のnetsh でネットワークの一覧を出力する

windows のネットワーク周りで便利なコマンド netsh

netsh コマンドがあれば、xBSDやLinuxみたいに、柔軟にネットワーク周りを扱うことが出来ます。

ネットワークのデバイス一覧を出力する。

netsh コマンドでネットワークの一覧をプリントするには、次のコマンドが便利です。

PS C:\Users\takuya> netsh interface ipv4 show interfaces

実例。

PS C:\Users\takuya> netsh interface ipv4 show interfaces

Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 20          25        1500  disconnected  Wi-Fi
 14          25        1500  connected     イーサネット
  8          65        1500  disconnected  Bluetooth ネットワーク接続 2

ifconfig っぽく表示する。

リストを展開した形式でびゅすることもできる。

PS C:\Users\takuya> netsh interface ipv4 show config

実例

PS C:\Users\takuya> netsh interface ipv4 show config
Configuration for interface "イーサネット"
    DHCP enabled:                         Yes
    IP Address:                           192.168.2.189
    Subnet Prefix:                        192.168.2.0/24 (mask 255.255.255.0)
    Default Gateway:                      192.168.2.1
    Gateway Metric:                       0
    InterfaceMetric:                      25
    DNS servers configured through DHCP:  192.168.2.1
                                          192.168.2.5
    Register with which suffix:           Primary only
    WINS servers configured through DHCP: None

Configuration for interface "Wi-Fi"
    DHCP enabled:                         Yes
    InterfaceMetric:                      25
    DNS servers configured through DHCP:  192.168.2.1
                                          192.168.2.5
    Register with which suffix:           Primary only
    WINS servers configured through DHCP: None


Configuration for interface "Bluetooth ネットワーク接続 2"
    DHCP enabled:                         Yes
    InterfaceMetric:                      65
    DNS servers configured through DHCP:  None
    Register with which suffix:           Primary only
    WINS servers configured through DHCP: None

Configuration for interface "Loopback Pseudo-Interface 1"
    DHCP enabled:                         No
    IP Address:                           127.0.0.1
    Subnet Prefix:                        127.0.0.0/8 (mask 255.0.0.0)
    InterfaceMetric:                      75
    Statically Configured DNS Servers:    None
    Register with which suffix:           Primary only
    Statically Configured WINS Servers:   None

特定のネットワーク・インタフェースを出力する。

名前を指定することで、特定のネットワークを表示することができる。

PS C:\Users\takuya> netsh interface ipv4 show config  "名前"

実例。

PS C:\Users\takuya> netsh interface ipv4 show config  "Loopback Pseudo-Interface 1"

Configuration for interface "Loopback Pseudo-Interface 1"
    DHCP enabled:                         No
    IP Address:                           127.0.0.1
    Subnet Prefix:                        127.0.0.0/8 (mask 255.0.0.0)
    InterfaceMetric:                      75
    Statically Configured DNS Servers:    None
    Register with which suffix:           Primary only
    Statically Configured WINS Servers:   None

ipconfig でもいいけど、netsh のほうが

ipconfig でも十分に間に合うのですが、netsh のほうがより細かいところに手が届く感じですし、コマンドと使い方がまとまっていて覚えやすい。また検索しやすい感じですね。

旧姓併記をしても現状何もメリットがないことがわかる。

免許証やマイナンバーカードに旧姓併記ができるようになった。 しかし、実際には「通用」できないことがわかる。

旧姓併記をしても現状何もメリットがないことがわかった

旧姓併記についてアレコレ、試行錯誤してる人も多い。

http://megamikostation.com/maiden-name-writing/ https://www.dailyshincho.jp/article/2019/11251131/?all=1&page=1

ネットを調べると旧姓併記で試行錯誤して五里霧中のなか挫折している人が数多くいる。

旧姓の通用は、「通称利用」という厳しい壁が立ちはだかる。それはLGBTの方々が名前や性別を変えるよりとても大変で、しかも理解が得られない。なんなら、在日朝鮮人の方々のほうが「通称利用」に正当な理由が認めらやすい、とても矛盾を孕んだ制度になっている。

銀行で旧姓利用に成功した例。

ネットを調べると、条件付きながら、旧姓の利用に成功した方々のブログが見つかる。銀行などで冷笑を浴びながら、粘り強く辛抱強く交渉してようやく認められるようだ。

通称名関係届を提出すれば、旧姓が使用できるようにいたします」と対応を変えた。はじめは「できません」としか言わなかったが、旧姓を通称として使用している場合、その名義で口座を作ることを認める特例があるそうだ。

ちゃんと説明すれば、対応できるようだ。

手続きに要した時間は、交渉も含めて1時間強。「旧姓を仕事で使用している」などの合理的な理由が必要とはいえ、証明までは求められない点で、より旧姓での口座使用が容易になったと思われる。総務省が旧姓使用を制度として後押ししているというのもプラスに働いたのかもしれない。

なるほど、銀行は緩和されたみたいですね。

緩和されているとはいえ、支店長クラスの決裁が必要ということになっている

信用金庫で試してみた。

地元の信用金庫でチャレンジしたが、「絶対ダメ」と言われた上、「支店長に相談」のうえ、銀行として対応を検討する。時間が必要という。

急いでいたので、旧姓利用を諦め、新規口座開設をし直すことになった。

ゆうちょ銀行

信用金庫でもだめだったし、ゆうちょ銀行(現在日本で最大規模の口座数を保持する、消費者に一番身近な金融機関)でチャレンジしたがだめだったので、電凸してみた。

とりあえず、ゆうちょ銀行に凸撃する。 https://www.jp-bank.japanpost.jp/contact/ctt_index.html

電話を掛けて、ゆうちょ銀行に突撃しておいた。

Q 旧姓併記した身分証があれば名前変更なくそのまま使えるのではないのか。
A できません。ゆうちょ銀行では一切できません。お名前変更のお届けを出して頂く必要がございます。

Q 総務省から全銀協などを通して、協力の要請が2017年頃にあったと思いますが、4年間も何もしてないのですか
 仕事などで、振り込みを受ける際に不便なので、旧姓併記の身分証をを通用させたいのですが、何が必要ですか?
A できないのです。ゆうちょ銀行として、旧姓併記の身分証を「氏名の変更がされたこと」の確認はできます。
 なにかしら手続きが、必要になったときに「名前の変更」が必要になります、併記では身分証として使えません。

Q 旧姓併記の身分証ができて数年経ちますが、ホームページに記載は無いのですか。
A 結婚の際には、届け出の名前を変更していただくとと記載があります。
Q 併記の身分証について記載はありますか?と聞いてるのですが?
A ですから、結婚など名前が変わられた際は
Q だーかーら、旧姓併記の身分証の名前使えません。対応しませんと、HPに記載、これが有るのか無いのか?
A ですから、結婚など・・
Q はいー、、、ないのですね?。わかりました。
A 他になにか
Q 大丈夫です。記載は無いこと、旧姓併記の利用に対応しない。とわかったので十分です。ありがとうございました。
A ありがとうございました。

夫婦別姓異世界のお話?

参考WEB記事においても、苦言が呈されていた。

https://www.dailyshincho.jp/article/2019/11251131/?all=1&page=4

しかし、自民党安倍晋三首相は7月3日の夫婦別姓に関する党首討論会で夫婦別姓制度を「認めない」姿勢を貫いている。  旧姓を住民票に併記できるようになったことは、姓を変更した側の不便を少し解消してくれた。しかし、「特例」扱いでようやく銀行口座を使える程度では、まだまだ「夫婦別姓制度はなくても大丈夫」とはいえない状況だ。  選択制夫婦別姓制度の導入や、旧姓を本名同様に扱えるシーンの拡大など、今後の展開に期待したい。

人間の尊厳に関わる部分なので「基本的人権」だと私は思うんだが。どうだろうか。

旧姓併記に関する情報

タイムゾーン(時刻)を設定する(dpkg-reconfigureの対話ダイアログなし)

タイムゾーン設定がめんどくさい。

ロケールタイムゾーンを設定をちまちま手作業でやるのがめんどくさい。

タイムゾーン設定(有人)

dpkg-reconfigure locales # ja_JP.UTF-8

タイムゾーン設定(無人

timedatectl set-timezone Asia/Tokyo

時刻設定のダイアログは

なれないうちは、勉強を兼ねて手順を意識してたほうがいいけど、なれると、もう手順を飛ばしたいよね。タイムゾーン設定・ロケール・初期ユーザーなど。 docker だとカスタムイメージをdockerfile でつくるし、LXC なら config でできる。楽しないとね

ただし、timedatectl はsystemd

takuya@:$ apt-file  search bin/timedatectl
systemd: /usr/bin/timedatectl

systemd が導入されない、docker イメージなどでは使えないので注意が必要

更新

2020-12-17 更新

ロケール(地域言語)を設定する(dpkg-reconfigureの対話ダイアログなし)

言語・地域のロケール設定がめんどくさい。

LXCで新規インスタンスを起動したり、dockerfile や インストールスクリプトを書いていると、ロケール設定がめんどくさい。手作業でやっていると、dpkg-reconfigure を使えばいいんですけど、不便。起動までコピペでやろうとすると、dpkgでストップしちゃって離席放置ができない。

地域・言語の設定をする方法

ロケール設定を、対話ダイアログでやる場合は、次のようになるが、

dpkg-reconfigure locales # ja_JP.UTF-8

無人で、自動でワンライナーで設定しようとすると次のようになる。

locale-gen --purge "ja_JP.UTF-8"
dpkg-reconfigure --frontend noninteractive locales

既存のロケールを一旦削除して作り直す場合

LANG=ja_JP.UTF-8 update-locale 

一般ユーザーなら sudo をつける。

sudo update-locale LANG=ja_JP.UTF-8

日本語版をインストールすればいいのでは?

lxc launch 
docker run 

など、コンテナの日本語イメージをわざわざ作成し選択するメリットよりも、ロケールでやったほうが楽そうなんですよね。

デプロイやバックアップ用のSFTPアクセスだけを許可する、公開鍵を使う。

SFTP だけができるユーザーを作ると。

バックアップ用やデプロイ用に、ユーザーを作るのがめんどくさい。

ちょっとしたコマンドは実行できなくてSFTPさえできればいいときに、デプロイ用のユーザを作って /etc/ssh/sshd_config で管理するのも面倒

そこで、www-data やroot などの nologin ユーザーにSSH接続を許可してSFTPだけを使うようにする。

公開鍵を登録する autorized_keys でアレコレできる。

authorized_keys に設定を書き込めば、制限や細かい設定を鍵ごとに帰ることできる。そこで、SFTPだけの許可をauthorized_keys に追記する。

authorized_keys に次のようにかけば、OK

command="internal-sftp" ssh-rsa AAAAB3NzaC1yc2EAAAA

chrroot する場合は

authorized_keyにオプションをつけたものを書き込めばいいみたい。

command="internal-sftp -d /var/www" ssh-rsa AAAAB3NzaC1yc2EAAAA

SFTP さえあれば事足ることが多い。

自分以外のlinuxユーザーアカウントが、SSHアクセスしたい場合の大半はファイル転送だと思うんだ。いちいちコマンド実行できるSSHを許可するのも面倒だよね。ということで、

関連資料

SFTPユーザを作る話 → SSHをSFTPに制限して、ディレクトリを制限(chroot)した専用アカウントを作る - それマグで!

Ahtorized_keys で公開鍵ごとに機能制限する話 → sshの公開鍵authorized_keys ファイルの制限機能について調べてみたら楽しかった. - それマグで!

参考資料

https://stackoverflow.com/questions/23448900/public-key-authorization-on-sftp-chroot-directory#31477162

systemd で引数で分割を使う(@:アットマーク)ユニットのテンプレート化で似たような複数サービスをまとめる。

systemd で引数を使う

@:アットマークを使えば、ユニットのテンプレート化で似たようなサービスをまとめることができる。

systemd の list-units をすると、user@1001.service のように、ユニット名@値 でいくつも起動しているので、自分でもそれを作って使えるようにしてみる。

テンプレート化された systemd ユニットの例

一番手軽に確認できるのは、 ユーザー毎の systemd だと思います。

 systemctl  --user status

これで確認すると、ユーザーの id ごとのジョブになっていることがわかります。

user@1001.service の設定元は、次のようなファイルです。ユニットのファイル名に@アットマークを入れることでテンプレートを明示しているみたいです。

user@.service

f:id:takuya_1st:20200924174028p:plain

実際に作ってみる。

今回は、システム全体ではなく、ユーザー毎のsystemd で試してみたいと思います。

ユーザーごとの systemd ユニットは、過去の記事に書きました。 → ユーザー毎の systemd を使ってシステム全体設定と個人用設定を分ける

ファイルの作成をします。

ユーザー空間に、ユニットファイルを作成します。

mkdir -p ~/.config/systemd/user/
touch ~/.config/systemd/user/my-loop-template@.service

このときに、名前に@ アットマーク を入れるのがポイントです。

my-loop-template@.serviceを編集します。

%i が引数として処理されます。

[Unit]
Description=テンプレートなサービスを作成する練習。 %i 秒スリープします

[Service]
ExecStart=bash -c 'while : ; do echo loop ; sleep %i ;done '

[Install]
WantedBy=default.target

テンプレートを実際のユニットとして登録します。

 systemctl  --user enable my-loop-template@10.service

すると、次のようなリンクが作られて、systemd ユニットが作成されたメッセージが出てきます。

Created symlink /home/takuya/.config/systemd/user/default.target.wants/my-loop-template@10.service
 → /home/takuya/.config/systemd/user/my-loop-template@.service.

サービスを開始します。

 systemctl  --user start my-loop-template@10.service

状態を確認します。

 systemctl  --user start my-loop-template@10.service

無事に、引数を決めたサービスが起動しているのがわかりす。これで引数つ変えるようになりました。

似たようなサービスをまとめて管理できることがわかります。

f:id:takuya_1st:20200924174836p:plain

もうひとつ起動してみます。

テンプレートとして動作しているのを確認するために、もう一つのサービスを作りながら、手順をおさらいします。

takuya@vps:~$ systemctl  --user start my-loop-template@100.service
takuya@vps:~$ systemctl  --user status my-loop-template@100.service
● my-loop-template@100.service - テンプレートなサービスを作成する練習。 100 秒スリープします
     Loaded: loaded (/home/takuya/.config/systemd/user/my-loop-template@.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2020-09-24 17:50:57 JST; 4s ago
   Main PID: 224128 (bash)
     CGroup: /user.slice/user-1001.slice/user@1001.service/my\x2dloop\x2dtemplate.slice/my-loop-template@100.service
             ├─224128 /usr/bin/bash -c while : ; do echo loop ; sleep 100 ;done
             └─224129 sleep 100

Sep 24 17:50:57 vps systemd[223671]: Started テンプレートなサービスを作成する練習。 100 秒スリープします.
Sep 24 17:50:57 vps bash[224128]: %

アットマークを複数入れてた場合

複数の@マークをいれれば、2つ使えるとかそんなこともないようです。 f:id:takuya_1st:20200924180235p:plain

タイマーで使う場合。

timer ユニットで使う場合は、どうなるでしょうか。試してみたいと思います。

結論を先に言えば、timer ユニットで使う場合は、一つずつサービスを起動は不要でした。

タイマーユニットを作成します。

@を名前に入れてテンプレートで作成しますします。

~/.config/systemd/user/my-loop-template@.timer

[Unit]
Description=My %i timer Sample

[Timer]
OnCalendar=minutely
RandomizedDelaySec=20
Unit=my-loop-template@%i.service

[Install]
WantedBy=default.target

タイマーユニットを有効にします。

タイマーユニットを引数付きで開始します。

 systemctl --user start my-loop-template@100.timer

すると、サービス側も有効になっていることがわかります。

f:id:takuya_1st:20200924183727p:plain

参考資料

redj.hatenablog.com

コマンドが存在するか調査するコマンド、その名もcommand

コマンド存在スルか調査するコマンドに command が使えます。

$ command -v ls ; echo $?
alias ls='ls --color=auto'
0

シェルの実行結果は 1/0 で戻されています。

echo $? は直前のシェルの実行結果$? を出力しています。正常終了なら0 異常終了なら $? > 0 が返されます。

あるとき

$ command -v ls ; echo $?
alias ls='ls --color=auto'
0

ないとき

command -v lsaaa > /dev/null  ; echo $?
1

command コマンドとは?

commandコマンド はその名前の通りコマンドを実行するプログラムでもあります。

$ command php -v
PHP 7.4.9 (cli) (built: Aug  7 2020 14:55:48) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies

マニュアルにもある通り、通常は type を使います。

ヘルプには、次のように書いてあります。

-v コマンドの詳細をプリントする、これは 組み込みの type コマンドと同じ機能です。

なので、通常は type を使えばいいと思います。

type と command の違い

type は STDERRに出力されます。

$ type lsaaa
-bash: type: lsaaa: not found

command コマンドは、何も出ません

$ command -v  lsaaa
$

bashrc などに書くときに、シェルのリダイレクトの書き方に差が出ます。

type では stderr を消さなくちゃいけないのに対し、command コマンドを使うなら、リダイレクトは1つで済みます。

command -v  lsaaa > /dev/null    && echo exists
type lsaaa > /dev/null  2>/dev/null  && echo exists

マニュアル

help command
command: command [-pVv] command [arg ...]
    Execute a simple command or display information about commands.

    Runs COMMAND with ARGS suppressing  shell function lookup, or display
    information about the specified COMMANDs.  Can be used to invoke commands
    on disk when a function with the same name exists.

    Options:
      -p    use a default value for PATH that is guaranteed to find all of
            the standard utilities
      -v    print a description of COMMAND similar to the `type' builtin
      -V    print a more verbose description of each COMMAND

    Exit Status:
    Returns exit status of COMMAND, or failure if COMMAND is not found.

検索エンジンの最適化による 困った問題

commandコマンド はその名前の通りコマンドを実行するプログラムでもあります。 しかし、その名前が「あまりに汎用的」な名前であるために、検索でキーワード無視されたり、インデックスの結果をうまく取り扱ってもらえません。

つまり、とっても検索をしにくい名前なんですね。