execに助けられる

あるとき、遠く離れた場所に設置してあるSolarisサーバへtelnetでログインした。
スーパーユーザはtelnetでのログインを禁止していたので、一般ユーザにて。

ユーザ名、パスワードを入力した後、bashが起動するようになっているが、
ログイン後に次のようなメッセージが表示された。

Last login: Wed Dec 15 17:07:43 from 172.10.5.1
bash: fork: 資源が一時的に使用できません。
bash-2.05$

資源不足?メモリもディスクもたっぷりあるはずなので、それはおかしいと思った。

とりあえず入力プロンプトは出ているので、何が起こっているのか調べようと思った。

bash-2.05$ top
bash: fork: 資源が一時的に使用できません。
bash-2.05$ ps -efl
bash: fork: 資源が一時的に使用できません。
bash-2.05$ ls
bash: fork: 資源が一時的に使用できません。
bash-2.05$ su
bash: fork: 資源が一時的に使用できません。
bash-2.05$ BAAAAAAAAAAAAAAKA
bash: fork: 資源が一時的に使用できません。

…何を打ってもダメだ。
/binの下のコマンドすら実行できない。
リブートしたいが、suができないのでスーパーユーザにもなれない。


諦めて、現地へ出向いてコンソールから入るしかないな、と思った。


ところで、なぜ今使っているbashは立ち上がっているのだろうか。

何気なく bashの組み込みコマンドであるhelpを実行した。

bash-2.05$ help
GNU bash, version 2.05.0(1)-release (sparc-sun-solaris2.9)
These shell commands are defined internally.  Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.

A star (*) next to a name means that the command is disabled.

 %[DIGITS | WORD] [&]               . filename
...

実行できる!!
ということは

bash-2.05$ jobs %1
bash: jobs: %1: no such job
bash-2.05$ kill 1111
bash: kill: (1111) - No such pid

現在ログインしているシェルの組み込みコマンドだけは実行できるらしい。

そこで、bashの全ての組み込みコマンドをマニュアルで参照し、この状況を打開する方法を模索した。




そこで思い付いたのが exec

bash-2.05$ exec su
Password:
#

exec、普段はほとんど使うことがないが、こういう時に役に立つとは。
execでコマンドを実行すると、コマンド用に新たにプロセスを立ち上げるのではなく、現在のシェルのプロセスでコマンドを実行する。 言わば捨て身のコマンド起動方法。シェルスクリプトでしばしば使ったりする。


スーパーユーザに切り替わり、マシンをリブートした。
とりあえず問題は解決した。




余談。
スーパーユーザにてpsを実行した。

# ps -efl
 F S      UID   PID  PPID  C PRI NI     ADDR     SZ    WCHAN    STIME TTY      T
IME CMD
19 T     root     0     0  0   0 SY        ?      0           10月 15 ?        0
:06 sched
 8 S     root     1     0  0  40 20        ?    198        ?  10月 15 ?        2
:49 /etc/init -
19 S     root     2     0  0   0 SY        ?      0        ?  10月 15 ?        0
:00 pageout

...

 8 Z   oracle 21048  4550  0   0                                               0
:00 <defunct>
 8 Z   oracle 19455  4550  0   0                                               0
:00 <defunct>
 8 Z   oracle 25783  4550  0   0                                               0
:00 <defunct>
 8 Z   oracle 20315  4550  0   0                                               0
:00 <defunct>
 8 Z   oracle 23918  4550  0   0                                               0
:00 <defunct>
 8 Z   oracle 20336  4550  0   0                                               0
:00 <defunct>
...(延々と続く)

某DBMSの恐ろしい数のゾンビプロセスで埋まっていた。
原因は分からず。


戻る