2021年 1月 の投稿一覧

Windows Update で WSLが起動しなくなった – レジストリをいじってイベントID 10016を解消

先日、WSLが突如起動しなくなるトラブルに見舞われました。

Twitterのほうで、解消までの顛末をつぶやいていたので、こちらでは解消のために実施すべき手順だけ簡単に記しておきます。

発生した事象

  • Windows Terminalを起動すると、「ユーザー設定の読込中にエラーが発生しました」と表示され、WSLのシェルが表示されなくなる(代わりに、設定ファイルの下位に記述されているPowerShellが起動する)
  • WSL(Ubuntu)を直接実行しても、プロンプトが表示されず反応なし
  • Ubuntu以外のディストリビューションをインストールしてみても、同様の状況
  • 「コンピューターの管理」でシステムイベントログをみると、ID10016が記録されていた

詳しい事象については、Twitterのほうに書いてますので、そちらも併せてご覧ください。

環境・バージョンなど

  • Windows 10 Pro 20H2 (OSビルド: 19042.782)
  • Windows Subsystem for Linux Update 5.4.72
  • Windows Terminal 1.2.2381.0

対処方法

  1. レジストリエディタから、「PerAppRuntimeBroker」の所有者をAdministoratorsに変更
  2. コンポーネントサービスから、「PerAppRuntimeBroker」の「起動とアクティブ化のアクセス許可」にSYSTEMを追加
  3. レジストリエディタから、「PerAppRuntimeBroker」の所有者をTrustedInstallerに戻す

以上です。

今回、事象を解決できたのは、WSL自体で問題が起きているらしいと推測できたことと、そこからWindowsのシステムログを確認しようと思い至ったことがきっかけでした。

原因の切り分けと、ログの確認を地道に行うという、トラブルシューティングの鉄則が効果てきめんだったという事例です。

操作方法については、とても詳しく説明しているWebサイトが多数ありますので、そちらを参照されるとよいかと思います。

あなたのお役に立てれば幸いです。

Makefileでのコマンド実行は $(shell command)

Makefileでdockerのイメージやコンテナをあれこれしたいという事情があって(これです)、その際に躓いたのでメモしておきます。

指定の名称のdocker コンテナがあるかどうかで処理を分ける、ということをしたかったので、以下のような感じでMakefileにターゲットを作成しました

test_container_exist:
	if [ $(docker ps -qa -f name=${NAME}) ]; then \
		echo container $(NAME) is exist. ; \
	else \
		echo contaier $(NAME) is not exist. ; \
	fi

実際に動かしてみると、条件として設定してあるdockerコマンドの実行結果が空っぽになってしまい( if [ ]; then になっている )、コンテナの有無にかかわらず常にelseのほうが実行されてしまうのでした。

コマンドラインから上記のdocker コマンドを実行すると、ちゃんと指定の名称のコンテナIDが返ってくるのですが…

いろいろ調べていたところ、どうやらMakefileの中でコマンドを実行するには $(shell command)とする必要があるとわかりました。

test_container_exist:
	# docker コマンドの前に、"shell" と付記する
	if [ $(shell docker ps -qa -f name=${NAME}) ]; then \
		echo container $(NAME) is exist. ; \
	else \
		echo contaier $(NAME) is not exist. ; \
	fi

できましたできました。こんなことに小一時間もかけてしまった…?

RTFMな事案でした。ちゃんとドキュメントに目を通すようにしたいです。

あなたのお役に立てれば幸いです。

ポートを利用しているプロセスを調べる: lsof -i :

netstat コマンドが使えない環境のとき。

nodeのWebサーバをkillするために、pidを調べる例。

$ lsof -i :8080
COMMAND   PID       USER  FD   TYPE  DEVICE  SIZE/OFF  NODE  NAME
node    23294  y-uchiida  19u  IPv6  671963       0t0   TCP  *:8080 (LISTEN)

ちなみにlsof は、”list open file” の略です。知らなかった。

あなたのお役に立てればうれしいです。