⛓️

SadServers解説#20 "Oaxaca": Close an Open File

2024/05/12に公開

https://ja.wikipedia.org/wiki/オアハカ

問題概要

シナリオ

開かれているファイルを閉じてください

問題詳細

/home/admin/somefileというファイルが、あるプロセスによって開かれています。プロセスを終了させずに、このファイルを閉じてください。

解決判定

Check My Solutionボタンをクリックしてください。

解答が正解かどうか、コマンドプロンプト上で確認することも可能です。次のコマンドを実行して、なにも出力されなければ正解です。

$  lsof /home/admin/somefile

 

問題解決の方針

【表示する】

プロセスを停止せずに、開かれているファイルを閉じるためにはどうすればよいのでしょうか…
一般的な方法はあまり思いつかないので、まずはどんなプロセスが/home/admin/somefileを開いているのか確認しましょう。

解決の手順を表示する
  1. /home/admin/somefileを開いているプロセスを確認する
  2. /home/admin/somefileを閉じるように変更を加える

 

ヒント

一部、SadServers公式のヒントを改変しています。

ヒント1

まずは、/home/admin/somefileを開いているプロセスを確認しましょう。

実行コマンド
$ lsof /home/admin/somefile 
COMMAND PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    814 admin   77w   REG  259,1        0 272875 /home/admin/somefile
$
$ ps aux | grep 814
admin        814  0.0  1.0   7004  4776 pts/0    S<s  13:16   0:00 bash
admin        819  0.0  0.1   5204   652 pts/0    S<+  13:16   0:00 grep 814

どうやら、Bashシェルが、FD(ファイルディスクリプタ)の77番として/home/admin/somefileを開いているようです。

ヒント2

現在のBashシェルのファイルディスクリプタを確認しましょう。

実行コマンド

現在のBashシェルのPIDは$$というシェル変数に格納されています。

$ echo $$
814
$ 
$ ls -l /proc/814/fd
total 0
lrwx------ 1 admin admin 64 May 12 13:16 0 -> /dev/pts/0
lrwx------ 1 admin admin 64 May 12 13:16 1 -> /dev/pts/0
lrwx------ 1 admin admin 64 May 12 13:16 2 -> /dev/pts/0
lrwx------ 1 admin admin 64 May 12 13:16 255 -> /dev/pts/0
l-wx------ 1 admin admin 64 May 12 13:16 77 -> /home/admin/somefile

やはり、Bashシェルが77番のファイルディスクリプタとして/home/admin/somefileを開いてしまっていますね。

ヒント3

77番のファイルディスクリプタと/home/admin/somefileとの関連付けを解除しましょう。
ファイルディスクリプタの関連付けはexecコマンドを使って解除することができます。

実行コマンド

特定のファイルディスクリプタを閉じるコマンドはexec [FD]>&-です。

$ exec 77>&-
$ 
$ ls -l /proc/814/fd
total 0
lrwx------ 1 admin admin 64 May 12 13:16 0 -> /dev/pts/0
lrwx------ 1 admin admin 64 May 12 13:16 1 -> /dev/pts/0
lrwx------ 1 admin admin 64 May 12 13:16 2 -> /dev/pts/0
lrwx------ 1 admin admin 64 May 12 13:16 255 -> /dev/pts/0
$ lsof /home/admin/somefile 
$

lsofコマンドが何も返さなくなりました!解決です。

 
「いきなり問題を解き始めても調べるばかりになってしまう…」 「やりたいことが分かっても、コマンドが分からない…」 という方は、下記の記事でLinuxのコマンドを復習してから、SadServersの問題に取り掛かってみてはいかがでしょうか。
https://zenn.dev/comf_nakamura/articles/linux_command
 

余談

ファイルディスクリプタはどこで指定されていたのか。

ログインシェルに記述がありました。

$ tail -1 .bashrc 
exec 77> /home/admin/somefile

問題一覧はこちら

https://zenn.dev/comf_nakamura/articles/sadservers_sitemap

Discussion