exec は、新しいプロセスを作らずに、現在のシェル環境で指定したコマンドを実行する シェルの組み込みコマンドです。通常のコマンド実行と異なり、exec を使うと現在のシェルプロセスが置き換えられるため、終了後にシェルに戻りません。また、引数なしで使うと ファイルディスクリプタのリダイレクト に利用できます。
Linuxのシステム管理において、execコマンドはしばしば見落とされがちなツールですが、その強力な機能を理解し活用することで、効率的なスクリプト作成やプロセス管理を実現することができます。この記事では、execコマンドの基本的な使い方から、実際の活用事例までを詳しく解説します。
構文(Syntax)
exec [コマンド [引数...]]
exec <リダイレクト>
主な用途
| 用途 | 説明 | 使用例 |
|---|---|---|
| コマンド実行 | シェルを置き換えて実行 | exec /bin/bash |
| スクリプト最適化 | プロセスを余分に作らず効率的に実行 | exec myscript.sh |
| ファイルディスクリプタ操作 | 出力や入力をリダイレクト | exec > logfile.txt |
| FD クローズ | 不要な FD を閉じる | exec 3>&- |
execコマンドの基本
execコマンドは、シェルに組み込まれたコマンドであり、特にプロセスを置き換える機能により、プロセスの効率的な管理が可能です。以下では、execコマンドの基本的な機能を解説します。
プロセスの置き換え
execコマンドの最も基本的な機能は、既存のプロセスを新しいプロセスで置き換えることです。たとえば、以下のように使用されることがあります。
exec ls -l
このコマンドは、現在のシェルをls -lコマンドで置き換えます。シェルが終了後に戻ってくるプロンプトがなくなることからもわかるように、元のシェルプロセスが完全に新しいプロセスによって置き換えられます。
ファイルディスクリプタの操作
execは、入出力のリダイレクトやファイルディスクリプタの操作にも利用できます。たとえば、シェルの標準出力をファイルにリダイレクトする場合は次のように記述します。
exec > output.txt
この例では、シェルの標準出力がoutput.txtというファイルにリダイレクトされます。このリダイレクト状態は、execを使うことにより現在のシェルセッション全体に影響を与えます。
標準入力を別ファイルに切り替える
コマンドの引数なしで exec を使うと、標準入力のリダイレクトも行えます。
exec < input.txt
while read line; do echo "行: $line"; done
この例では、その後の read コマンドがファイルから入力を受け取るようになります。
ファイルディスクリプタを閉じる
不要になったファイルディスクリプタを明示的に閉じることができます。
exec 3>&-
ファイルディスクリプタ 3 を閉じます。開きっぱなしの FD を整理してリソースリークを防ぐ場合に有効です。
execコマンドの活用事例
実際にexecコマンドをシステム管理に活用する方法を見ていきましょう。プロセス管理やリソースの効率的な使用など、様々な場面でexecは役立ちます。
スクリプト内でのプロセス置き換え
スクリプトの最終行でexecを使用することにより、スクリプト自体を新しいプログラムに置き換えることができます。例えば、サーバーの起動スクリプトでスクリプト終了後にプロセス制御をその起動プロセスに移させる場合などに有効です。
#!/bin/bash
echo "Starting server..."
exec /usr/local/bin/myserver
このスクリプトでは、サーバー起動後スクリプトがサーバープロセスによって置換され、メモリ使用の最適化が図れます。
永続的なログファイルの作成
システムに対するログ記録を永続させるため、execを用いたリダイレクトが有効です。システムメンテナンス中に発生する出力をすべてログに記録する例を見てみましょう。
exec 1>>system_maintenance.log 2>&1
ここでは、標準出力(ファイルディスクリプタ1)と標準エラー出力(ファイルディスクリプタ2)の両方を同じログファイルに記録するための設定を行っています。これにより、後から発生した問題の解析が容易になります。
リソース節約
軽量なデーモンプロセスを実行する際にもexecの値を見出せます。通常デーモン化で使われる手法で、子プロセスを生成する代わりにプロセスを置換しメモリ占有を低減します。
exec mydaemon &
これは、mydaemonを背景で実行するための手法です。子シェルを生成しないため、リソース消費が抑えられます。
注意点と考慮事項
execコマンドの強力さは、その簡潔さにありますが、誤用すると想定外の問題を引き起こす可能性もあるため、どのように機能するかを知っておく必要があります。
元に戻せないプロセス置き換え
一度execによってプロセスが置き換えられると、元のプロセスには戻れません。これにより、終了したいセッションや元に戻したい操作を行うことができなくなる危険性があります。
リダイレクトの影響
execによるリダイレクトもまた不可逆的です。実行後すべての出力がリダイレクトされた状態を保つので、出力を制御する場合は慎重になる必要があります。
デバッグの困難
スクリプトやコマンドのデバッグにexecを使うと、新しいプロセスに置き換わってしまうため、トレースが難しくなることがあります。デバッグ時には、徐々に取り入れて予行練習をすることがすすめられます。
存在しないコマンドを指定した場合
exec に存在しないコマンドを渡した場合、シェルは終了せずエラーだけを返します。
exec notfound
bash: exec: notfound: not found
プロセスの置き換えは起きないため、スクリプトはその後も続行します。この点はデバッグ時に覚えておくと役立ちます。
関連コマンド / 構文
source:シェルを置き換えずにスクリプトを読み込む.(ドットコマンド):sourceと同義exit:シェルを終了する
備考
execは 外部コマンドではなくシェル組み込み です。which execでは場所が出ません。- プログラムのラッパースクリプトで使うと、余計なプロセスを残さず実行できる利点があります。
- リダイレクト専用で使うケースも多く、
exec > logfileとするとその後の出力はすべてファイルに記録されます。
まとめ
execコマンドは、Linuxシステム管理における強力なツールの一つであり、正しく理解し活用することでプロセス管理の効率化をはかることができます。プロセスの置き換えやリダイレクトの利用を通して、システムリソースの最適化を図ることが可能です。その作用を理解し慎重に用いることで、日々のシステム管理が大幅に改善されることでしょう。どう活用するかは個々のニーズによりますが、ぜひこの機会にexecの新しい使い道を考え、日々の業務に役立ててみてください。
参考
- manページ: man7.org exec(1p)
- GNU Bash Manual: Bash Reference – Bourne Shell Builtins

コメント