「シェルスクリプトの基礎 - シグナルとtrapコマンド」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

ページの作成:「== 概要 == シグナルとは、プロセス間で通信を行うための仕組みであり、Linuxカーネルに実装されている。<br> 実行中のプロセス…」
 
104行目: 104行目:
== trap コマンド ==
== trap コマンド ==
==== trapコマンドの使用方法 ====
==== trapコマンドの使用方法 ====
trapコマンドは、送出されたシグナルを捕捉して、予め指定された処理を実行するコマンドである。<br>
<code>trap</code>コマンドは、送出されたシグナルを捕捉して、予め指定された処理を実行するコマンドである。<br>
  trap "<コマンド>" <シグナルリスト>
  trap "<コマンド>" <シグナルリスト>
<br>
<br>
実行中のシェルスクリプトに対して送出されたシグナルは、trapコマンドを使用することで捕捉することができる。
実行中のシェルスクリプトに対して送出されたシグナルは、<code>trap</code>コマンドを使用することで捕捉することができる。<br>
 
<br>
killコマンド等により、シグナルリストに指定されたシグナルが送出されると、trapコマンドはそれを捕捉して、指定したコマンドを実行する。
<code>kill</code>コマンド等により、シグナルリストに指定されたシグナルが送出されると、<code>trap</code>コマンドはそれを捕捉して、指定したコマンドを実行する。<br>
trapコマンドを使用することにより、各シグナルの規定の動作を置き換えることができる。
<code>trap</code>コマンドを使用することにより、各シグナルの規定の動作を置き換えることができる。<br>
ただし、強制終了のシグナルである9番はtrapすることはできないため、注意すること。
<u>ただし、強制終了のシグナルである9番はtrapすることはできないため、注意すること。</u><br>
 
  trap "echo trapped." 2
  trap "echo trapped." 2
   
   
120行目: 119行目:
<br>
<br>
==== trap処理のリセット ====
==== trap処理のリセット ====
trap コマンドでシグナル捕捉時に実行するように指定した動作は、リセットを行うことで解除することができる。
<code>trap</code>コマンドでシグナル捕捉時に実行するように指定した動作は、リセットを行うことで解除することができる。<br>
 
<br>
trap シグナルリスト
<code>trap</code>コマンドにシグナルリストのみを指定して、指定されたシグナルの捕捉処理をリセットする。<br>
trap コマンドにシグナルリストのみを指定し、指定されたシグナルの捕捉処理をリセットする。
trap <シグナルリスト>
 
<br>
trap コマンドで指定した処理をリセットしたい場合、つまり trap 'rm -f *.tmp; exit 1' 1 2 3 15 などと指定していた動作を、各シグナルのデフォルトの動作に戻したい場合は、trap 1 2 3 15 のように trap コマンドにリセットしたいシグナルのみを指定し実行する。
<code>trap</code>コマンドで指定した処理をリセットする場合(例: <code>trap "rm -f *.tmp; exit 1" 1 2 3 15</code>)、<br>
 
各シグナルの標準の動作に戻すには、<code>trap 1 2 3 15</code>のように、リセットするシグナルのみを指定して実行する。<br>
trap コマンドの処理を指定していた部分に何も書かないことにより、シグナル受信時にデフォルトの動作をするようになる。ただし、処理部分に何も書かないと言っても**「trap '’ 1 2 3 15」とはまったく意味が違う**ので注意が必要だ。
<br>
 
<code>trap</code>コマンドの処理を指定した部分に何も記述しないことにより、シグナル受信時に標準の動作に戻すことができる。<br>
 
<br>
<u>※注意</u><br>
<u>ただし、<code>trap "" 1 2 3 15</code>と記述した時、シグナルを捕捉した場合は""を実行する。</u><br>
<u>これは何も処理をしないという意味になり、結果として、該当するシグナルを無視するという設定になってしまう。</u><br>
<br>
trap 'echo trapped.' 2
# ここで、[Ctrl]+[C]キーを押下する
trapped.  # trapコマンドに指定した処理が実行される
trap 2  # trapコマンドの設定をリセットする
# ここで、[Ctrl]+[C]キーを押下する
   
   
trap '' 1 2 3 15 と書くと、シグナルを捕捉した場合は '' を実行する、つまり何もしない処理を実行するという意味になり、結果として該当するシグナルを無視するという設定になってしまう。
# 指定した処理が解除されているのが確認できる
 
$ trap 'echo trapped.' 2
※ ここで Ctrl+c を押す。
$ trapped.
#↑trap に指定した処理が実行されている。
 
$ trap 2
#↑trap をリセットする。
※ ここで Ctrl+c を押す。
$
#↑指定した処理が解除されているのが確認できる。
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:シェルスクリプト]]
[[カテゴリ:シェルスクリプト]]