Write failed: Broken pipeでssh接続が切断されるのを防ぐ

sshで接続したあと操作せずに一晩捨ておくと知らぬ間に「Write failed: Broken pipe」というメッセージが表示されてセッションが切断されている。再度、接続し直すのも手間であるから設定を取り繕って切断されぬようにするものである。

$ vi ~/.ssh/config
Host *
  ServerAliveInterval 30
  ServerAliveCountMax 10

ServerAliveIntervalはサーバからデータが送られてこなくなってから何秒後に応答を求めるメッセージを投げつけるか定める模様である。デフォルトではそもメッセージを放たないという。メッセージの中身をtcpdumpで覗いてみるとPSHフラグを立てたパケットを送りつけているようであった。

$ sudo tcpdump -n -i ens3 port 22
(snip)
22:50:30.488309 IP 192.0.2.1.55773 > 153.121.51.164.22: Flags [P.], seq 72:108, ack 109, win 305, options [nop,nop,TS val 1047147664 ecr 177098205], length 36
22:50:30.488696 IP 153.121.51.164.22 > 192.0.2.1.55773: Flags [P.], seq 109:145, ack 108, win 309, options [nop,nop,TS val 177105717 ecr 1047147664], length 36
22:50:30.506156 IP 192.0.2.1.55773 > 153.121.51.164.22: Flags [.], ack 145, win 305, options [nop,nop,TS val 1047147668 ecr 177105717], length 0

22:51:00.536025 IP 192.0.2.1.55773 > 153.121.51.164.22: Flags [P.], seq 108:144, ack 145, win 305, options [nop,nop,TS val 1047155176 ecr 177105717], length 36
22:51:00.536334 IP 153.121.51.164.22 > 192.0.2.1.55773: Flags [P.], seq 145:181, ack 144, win 309, options [nop,nop,TS val 177113229 ecr 1047155176], length 36
22:51:00.554444 IP 192.0.2.1.55773 > 153.121.51.164.22: Flags [.], ack 181, win 305, options [nop,nop,TS val 1047155180 ecr 177113229], length 0
(snip)

ServerAliveCountMaxはサーバからの反応が無くなった際、応答を呼びかけるメッセージを何回送りつけるかを定め、これを超えたら切断してセッションを終える模様である。デフォルトでは3回という取り決めであった。したがって概ね

ServerAliveInterval ✕ ServerAliveCountMax

秒の間、サーバから返答がなければTimeout, server hostname not responding.というようなメッセージと共に切断するというものである。

参考:
man ssh_config
How to prevent “Write Failed: broken pipe” on SSH connection?

消灯したコンソール画面を点灯させる

Raspberry Pi 3 Model B
OS: Raspbian stretch lite November 2017

キーボードもマウスも接続されていないRaspberry Pi 3にディスプレイだけが接続されている。デフォルトでは600秒でコンソール画面が消灯するようセットされているから起動して10分が経過するともはや何も見えない。

$ cat /sys/module/kernel/parameters/consoleblank
600

時にはコンソール画面の表示を拝見したいことがあるけれどもわざわざキーボードやマウスを接続するのも手数がかかるのでそういうときはsshで接続してこうである。

$ sudo su -c "setterm --term linux --blank 10 > /dev/tty1"

これで消灯していたディスプレイに灯が入った。blankの数値は0~60まで分単位で指定するようである。この内、0は決して消灯してはならぬという指示になる。或いは--blank pokeオプションを用いて次のようなコマンドを実行してもよろしい。

$ sudo su -c "setterm --term linux --blank poke < /dev/tty1"

点灯させたは良いがやはり今すぐ消灯させたいならば--blank forceである。此れはキーボードやマウス操作をしたとて消灯が解消されるものではなくなるから今後は手探りで操作するか再び--blank pokeで点灯するか選択を迫られるところである。

$ sudo su -c "setterm --term linux --blank force < /dev/tty1"

ところで以前はsettermのオプションはハイフン一つだった気がするけれども近頃はハイフン二つをサポートするようになったことに気がついた。

COMPATIBILITY
Since version 2.25 setterm has support for long options with two hyphens, for example --help, beside the historical long options
with a single hyphen, for example -help. In scripts it is better to use the backward-compatible single hyphen rather than the
double hyphen. Currently there are no plans nor good reasons to discontinue single-hyphen compatibility.

なおRaspberry Piを再起動しても永続的に消灯時間を指定するならコマンドラインオプションでconsoleblankを引き渡せばよいということである。単位は秒であった。

$ sudo vi /boot/cmdline.txt
#dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=fb9e6cf7-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=fb9e6cf7-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait consoleblank=0

settermコマンドのblankオプションと違ってconsoleblankはどうやら60分が上限では無い模様であり莫大な数値を指定しても受け入れた。然し乍ら1億5千万を超えたあたりから起動時のメッセージが表示されずラズベリーが四つ並んでいる画面しか表示されなくなったので無闇に大きな値を放り込むのは良くないと思った。

$ cat /sys/module/kernel/parameters/consoleblank
150000000

参考:
How do I prevent the screen from going blank?
The Kernel Command Line - Raspberry Pi Documentation

systemdを用いてマシン起動時にMySQLを起動するよう設定

OS: Ubuntu Server 16.04
MySQL 5.7.21

大変な権勢を誇っているsystemdで以ってMySQLの起動や停止を管理しようと息巻いてオンラインの文献を二、三斜め読みしたところでこれはえらいものに手を出してしまったぞと気付いた。マニュアルが多数あり分量も膨大でどこから手を付けていいか途方に暮れた。も少し軽薄に臨む心づもりでいたからこれには参った。とまれMySQLのドキュメントを見ているとcmakeのオプションでsystemd用のファイルをインストールするものがあるようである。

-DWITH_SYSTEMD=bool

Whether to enable installation of systemd support files. By default, this option is disabled. When enabled, systemd support files are installed, and scripts such as mysqld_safe and the System V initialization script are not installed. On platforms where systemd is not available, enabling WITH_SYSTEMD results in an error from CMake.

-DWITH_SYSTEMD=1を加えてMySQLをビルド、インストールしてみるとなるほどmysqld.serviceというファイルがインストールディレクトリに放り込まれて居る。どのような取り扱いが定石であるか判然としないけれども、手探りで設定したところなんだか希望どおりには動いている模様である。まずはMySQLの起動オプションを書き付けた。

$ sudo vi /etc/default/mysql
MYSQLD_OPTS="--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=mysql.err --pid-file=/usr/local/mysql/data/mysql.pid"

次にユニットファイル(mysqld.service)を/etc/systemd/system/へコピーし、みずからの環境に合致するようオプションを編集した。

$ cd /usr/local/mysql
$ sudo cp mysqld.service /etc/systemd/system/
$ sudo vi /etc/systemd/system/mysqld.service
#PIDFile=/var/run/mysqld/mysqld.pid
PIDFile=/usr/local/mysql/data/mysql.pid

#ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS
ExecStart=/usr/local/mysql/bin/mysqld --daemonize $MYSQLD_OPTS

#EnvironmentFile=-/etc/sysconfig/mysql
EnvironmentFile=-/etc/default/mysql

そうしたらシステムの起動時にMySQLが起動するようsystemctl enableコマンドで執り成してやる。マシンを再起動してみるとたしかにMySQLが自動で立ち上がっているので概ね成功と言ってよかろうとおもう。

$ sudo systemctl enable mysqld.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /etc/systemd/system/mysqld.service.

$ systemctl list-unit-files mysqld.service
UNIT FILE      STATE
mysqld.service enabled

なお手動でMySQLを起動するならこういう具合である。ステータスを確認することもできるようである。

$ sudo systemctl start mysqld
$ sudo systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/etc/systemd/system/mysqld.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-03-22 20:42:22 JST; 15s ago
(snip)
Mar 22 20:42:22 mysql-systemd-test systemd[1]: Started MySQL Server.

ユニットファイルの全貌はこういう塩梅である。

$ cat /etc/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/usr/local/mysql/data/mysql.pid
TimeoutSec=0
PermissionsStartOnly=true
ExecStartPre=/usr/local/mysql/bin/mysqld_pre_systemd
ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/usr/local/mysql/data/mysql.pid $MYSQLD_OPTS
EnvironmentFile=-/etc/default/mysql
LimitNOFILE = 5000
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false

参考:
systemd.exec
systemd – ArchWiki
systemd – Wikipedia
2.5.10 Managing MySQL Server with systemd
What is $OPTIONS in a systemd service file?

コマンドプロンプトからdesktop.iniを表示する

OS: Windows 10 version 1709

フォルーダオプションから「隠しファイル、隠しフォルダー、または隠しドライブを表示する」を選択し、「保護されたオペレーティング システムファイルを表示しない(推奨)」のチェックを外せばdesktop.iniのアイコンが姿をあらわすけれどもちょっと手間である。コマンドプロンプトであればも少し手数が少なくて良い。desktop.iniのファイル属性をattribコマンドで詳らかにするとこうである。

C:\Users\guro\Desktop>attrib
A  SH        C:\Users\guro\Desktop\desktop.ini

SとHはそれぞれシステムファイル属性、隠しファイル属性を示しておりこれらの属性がファイルを透明な存在たらしめる。そうであるからこれらを解除できればしめたものである。ヘルプによれば-sと-hオプションを用いると良い。

C:\Users\guro\Desktop>attrib -s -h desktop.ini
C:\Users\guro\Desktop>attrib
A                    C:\Users\guro\Desktop\desktop.ini

これで包み隠されていたdesktop.iniのアイコンが露見する。+sと+hオプションで以って再び非表示にできる。

C:\Users\guro\Desktop>attrib +s +h desktop.ini
C:\Users\guro\Desktop>attrib
A  SH                C:\Users\guro\Desktop\desktop.ini

参考:
attrib | Microsoft Docs

動画ファイルのアイコンをMPC-BEのものに関連付ける

OS: Windows 10 version 1709
MPC-BE(64bit) 1.5.2 (build 3445) beta

何の拍子か突然に動画ファイルのアイコンがMPC-BEのデフォルトアイコンで統一されてしまい泡を食った。MPC-BEのデフォルトアイコンがたいへん控えめなデザインであるから見た目を色とりどりの華やかなアイコンに再び変更しようと試みるものである。MPC-BEを起動したら「表示」→「オプション」と辿ってゆく。

プレーヤーのカテゴリにある「形式」の設定画面を表示し「変更」ボタンを押下する。

「アイコンの関連付け」にチェックを入れ「適用」をクリックする

ことでアイコンがきらびやかなデザインへと変更される。適用ボタンをクリックすると「既定のプログラムを設定する」ウィンドウがどうしてか立ち上がって来るけれども閉じて躱した。

なお、アイコン画像は以下のDLLファイルに格納されておりResourcesExtractなどで内部を窺うことができた。

C:\Program Files\MPC-BE x64\mpciconlib.dll