質問: Linuxのshutdownコマンドとrebootコマンドについて質問です。 先日、職場で、rebootコマンドを実行するとまずいので、再起動時は"shutdown -r now"を指定するように言われました。 (環境変数や設定が消える?) しかし、その理由が調べてもわかりません。 rebootコマンドとshutdownコマンドの違いは何なのでしょうか? ---追記 2016/12/17--- 皆さん回答ありがとうございます。 質問が放置気味になってしまい、申し訳ありません。 様々な意見があり、とても参考になりました。 回答を見て疑問に思ったのですが、shutdowmコマンドのコードを見ることはできないのでしょうか? "man page of SHUTDOWN"のページに記述されているファイルを見ても、ファイルが存在しないか、バイナリファイルなので、ソースコードの確認方法が存在するなら知りたいです。 追加の質問となってしまいますが、よろしくお願いいたします。
回答: その指摘した人、結構おっさんじゃないでしょうか? この「rebootはシステムを壊すから使ってはいけない」はインフラ系SEの中で都市伝説のように語り継がれていますが、**Linuxにおいては使っても全く問題ありません**。正確には「*UNIX(Linuxを含めず)で* rebootはシステムを壊すから使ってはいけない」です。 Linuxについては、Man page of SHUTDOWNにあるように、`reboot`は`shutdown -r -q now`のエイリアスです(シェルのエイリアスというわけではなく、内部で`shutdown -r -q now`を呼び出しているだけと言うこと)。`shutdown`と同じくinitシステムを6に切り替えるため、サービスを順番に落とし(最新のLinuxではsystemdやupstartが採用される場合が多いですが、同じように順番にサービスを落とします)、再起動を行います。サービスが依存関係に基づいた安全な順序でおとされ、各終了処理も実行されますので、`shotdown`を使う場合と同じく、安全に再起動が可能です。 しかし、LinuxではないUNIXでは違います。次の二つを見てください。 FreeBSD 11.0 | On-line Manual of "reboot" Solaris 11.2 | reboot - マニュアルページセク ション 1M: システム管理コマンド FreeBSDとSolarisでは、`shutdown`へのエイリアスででも呼び出す物でもありません。これらの`reboot`では、initシステムの切り替えが発生せず、全てのプロセスに対して終了シグナルを送るだけです。サービスの終了順序は守られませんし、initスクリプトに記載された終了時の処理も行われません。そのため、サービスによってはテンポラリファイルやPIDファイルが残ったり、エラーが記録されたり、最後の情報が書き込まれなかったり等の不具合が起きる可能性があります。だから、通常は使ってはいけないコマンドだったのです。(`shutdown`コマンドと違い、各サービスの終了処理が終わらずいつまでも再起動しないと言うことがありません。そういった不具合が発生したときに、強制的に再起動したいときに使うのが`reboot`です。) ※ macOS Sierraの`reboot`も、マニュアルがFreeBSDと同じでしたの。OpenBSDでは、rcスクリプトの処理まで行いますが、`shutdown`とは独立しているようです。同じBSD系UNIXであっても細部の動作は異なる可能性があります。HP-UX等の他のSystem V系UNIXついてはわかりません。実機やマニュアル等をお持ちの方は情報をコメントいただければと思います。 ということで、そんなことを言われたら。`man reboot`と打って、その画面を見せながら、「えっ、先輩は、Linuxの場合はrebootがshutdown呼び出しと同じだから安全に再起動できる、って知らなかったですか?ププッ」とドヤ顔で言ってあげましょう。きっと、素敵な課題を与えてくれるに違いありません。 【追記】 * Linuxにおいては、同様の理由で`halt`も安全です。(UNIXでは危険) * `shutdown`には、オプションで無効を指定しない限り`sync`の処理が含まれます(`shutdown`を呼び出す`reboot`や`halt`も同様です)。`shutdown`等を実行する前に`sync`を打たなくても問題はありません。Man page of SYNCも参考にしてください。 なお、私は昔の癖で ``` # sync # sync # sync # shutdown -i6 -g0 -y ``` と打ってしまういそうになる古い人間ですが...。