SadServers解説#20 "Oaxaca": Close an Open File
問題概要
シナリオ
開かれているファイルを閉じてください
問題詳細
/home/admin/somefile
というファイルが、あるプロセスによって開かれています。プロセスを終了させずに、このファイルを閉じてください。
解決判定
Check My Solution
ボタンをクリックしてください。
解答が正解かどうか、コマンドプロンプト上で確認することも可能です。次のコマンドを実行して、なにも出力されなければ正解です。
$ lsof /home/admin/somefile
問題解決の方針
【表示する】
プロセスを停止せずに、開かれているファイルを閉じるためにはどうすればよいのでしょうか…
一般的な方法はあまり思いつかないので、まずはどんなプロセスが/home/admin/somefile
を開いているのか確認しましょう。
解決の手順を表示する
-
/home/admin/somefile
を開いているプロセスを確認する -
/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の問題に取り掛かってみてはいかがでしょうか。
余談
ファイルディスクリプタはどこで指定されていたのか。
ログインシェルに記述がありました。
$ tail -1 .bashrc
exec 77> /home/admin/somefile
問題一覧はこちら
Discussion