Solaris のシステム管理 (第 2 巻)

第 30 章 システムイベントのスケジュール設定

この章では、crontab および at コマンドを使用して、ルーチンまたは 1 度限りのシステムイベントをスケジュールする方法を示します。さらに、cron.denycron.allowat.deny の各ファイルを使用して、これらのコマンドへのアクセスを制御する方法も説明します。

この章で説明する手順は次のとおりです。

システムイベントのスケジューリング用コマンド

システムイベントは、crontab コマンドを使用して定期的に繰り返し実行するようにスケジュールできます。また、at コマンドを使用して、特定のシステムイベントを指定の時刻に実行するようにスケジュールすることもできます。表 30-1crontabat の他に、これらのコマンドへのアクセスを制御できるファイルを示します。

表 30-1 システムイベントのスケジューリング用コマンド

コマンド 

スケジューリングの対象 

ファイルの格納場所 

アクセス制御用ファイル 

crontab

一定間隔で実行する複数のシステムイベント 

/var/spool/cron/crontabs

/etc/cron.d/cron.allow

/etc/cron.d/cron.deny

at

1 つのシステムイベント 

/var/spool/cron/atjobs

/etc/cron.d/at.deny

繰り返されるシステムイベントのスケジューリング (cron)

以降の各項で、crontab ファイルをどのように作成、編集、表示、削除するか、さらに、それらのファイルへのアクセスをどのように制御するかを説明します。

crontab ファイルの内容

cron デーモンは、各 crontab ファイル内にあるコマンドに従ってシステムイベントをスケジュールします。crontab ファイルには、それぞれ一定間隔で実行されるコマンドが 1 行に 1 つずつ入っています。各行の先頭は cron デーモンが各コマンドを実行する日時情報です。

たとえば、SunOS ソフトウェアのインストール時に root という名前の crontab ファイルが提供されますが、このファイルの内容は次のとおりです。


10 3 * * 0,4 /etc/cron.d/logchecker
10 3 * * 0   /usr/lib/newsyslog
15 3 * * 0 /usr/lib/fs/nfs/nfsfind
1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean

最初のコマンド行は、日曜日と木曜日の午前 3 時 10 分に logchecker を実行するようシステムに指示します。2 番目のコマンド行は、毎日曜日の午前 3 時 10 分に newsyslog を実行するようにシステムをスケジュールします。3 番目のコマンド行は毎日曜日午前 3 時 15 分に nfsfind を実行するようにシステムに指示します。4 番目のコマンド行は、毎日夏時間をチェックして、必要であれば修正するようにシステムに指示します。RTC タイムゾーンも /etc/rtc_config ファイルもない場合、このエントリは何もしません。 5 番目のコマンド行では、Generic Security Service テーブル /etc/gss/gsscred_db に重複エントリがないかどうかを調べ、あれば削除します。

crontab ファイル内のコマンド行の構文の詳細は、crontab ファイルエントリの構文」を参照してください。

crontab ファイルは /var/spool/cron/crontabs) に格納されます。SunOS ソフトウェアのインストール時には、root 以外にもいくつかの crontab ファイルが提供されます (表 30-2 を参照してください)。

表 30-2 デフォルトの crontab ファイル

crontab ファイル

機能 

adm

アカウンティング 

lp

印刷 

root

一般的なシステム機能とファイルシステムの整理 

sys

性能情報の収集 

uucp

一般的な uucp の整理 

デフォルトの crontab ファイルの他に、ユーザーは crontab ファイルを作成してユーザー自身のシステムイベントをスケジュールできます。

その他の crontab ファイルは、それらの中に作成されるユーザーのアカウントに基づいて、bobmarysmithjones などのように命名されます。

root または他のユーザーが所有する crontab ファイルにアクセスするには、スーパーユーザーの特権が必要です。

crontab ファイルを作成、編集、表示、削除する手順については、「システムイベントのスケジューリング用コマンド」で説明します。

cron デーモンのスケジューリング

cron デーモンは crontab コマンドの自動スケジューリングを行います。このデーモンの機能は、通常 15 分おきに、/var/spool/cron/crontabs を調べて crontab ファイルがないか確認します。新しい crontab ファイルがないか、または既存の crontab が変更されていないかを確認し、いずれかがあった場合は、ファイル内のリストから実行時刻を読み取り、コマンドが正しい時刻に実行されるよう指示します。

ほとんど同様に、cron デーモンは /var/spool/cron/atjobs ディレクトリ内の at ファイルのスケジューリングを制御します。

crontab ファイルエントリの構文

crontab ファイルは、1 行に 1 つのコマンドが入った構成になっています。これらのコマンド行の最初の 5 つのフィールドには、コマンドが実行される時刻を指定し、それぞれスペースで区切ります。表 30-3 にこれら 5 つのフィールドを示します。

表 30-3 crontab 時刻フィールドの値

時刻フィールド 

値 

分 

0-59 

時 

0-23 

日 

1-31 

月 

1-12 

曜日 

0 - 6 (0 は日曜日) 

次に、crontab 時刻フィールドで特殊文字を使用する際のガイドラインを示します。

たとえば、次の crontab コマンドエントリの例は、毎月 1 日と 15 日の午後 4 時に、ユーザーのコンソールウィンドウに注意を促すメッセージを表示します。


0 16 1,15 * * echo Timesheets Due > /dev/console

crontab ファイル内の各コマンドは、長くても 1 行内に入れなければなりません。これは、crontab が 2 番目以降のキャリッジリターンを認識しないからです。(つまり、複数行とした場合は、同じコマンドとはみなされないということです。) crontab のエントリとコマンドオプションの詳細は、crontab(1) のマニュアルページを参照してください。

crontab ファイルの作成と編集

crontab ファイルの最も単純な作成方法は、crontab -e コマンドを使用して、EDITOR 環境変数によって定義されているテキストエディタを呼び出すものです。この変数を設定していない場合は、crontab はデフォルトのエディタ ed を使用します。EDITOR 環境変数に使い慣れたエディタを定義します。次の例は、エディタが定義されているかどうかを確認する方法と、vi をデフォルトとして設定する方法を示しています。


$ which $EDITOR
$ 
$ EDITOR=vi
$ export EDITOR

crontab ファイルを作成すると、自動的に /var/spool/cron/crontabs ディレクトリ内に格納され、作成者のユーザー名が命名されます。スーパーユーザー特権があれば、他のユーザーや root の crontab ファイルを作成または編集できます。

crontab コマンドエントリは、crontab ファイルエントリの構文」の説明に従って入力してください。

crontab ファイルを作成または編集する方法

  1. (省略可能) root または他のユーザーが所有する crontab ファイルを作成または編集する場合は、スーパーユーザーになります。

  2. 次のように入力して、新しい crontab ファイルを作成するか、既存の crontab ファイルを編集します。


    $ crontab -e [username]

    username

    他のユーザーのアカウント名。作成または編集するにはスーパーユーザーの権限が必要 


    注意 - 注意 -

    誤ってオプションを指定しないで crontab コマンドを入力した場合は、使用しているエディタの割り込みキーを押してください。割り込みキーを押すと、変更結果を保存しないでエディタを終了できます。この時点でファイルの編集を終了して変更結果を保存すると、既存の crontab ファイルが空のファイルで上書きされてしまいます。


  3. crontab ファイルエントリの構文」で説明している構文に従って、コマンド行を crontab ファイルに追加します。

    crontab ファイルは /var/spool/cron/crontabs に格納されます。

  4. crontab -l コマンドを使用して、crontab ファイルを確認します。


    # crontab -l [username]

例 - crontab ファイルを作成または編集する

次の例は、他のユーザーのための crontab ファイルをどのように作成するかを示します。


# crontab -e jones

新しい crontab ファイルに次のコマンドエントリを追加すると、毎日曜日の午前 1 時に、ユーザー jones のホームディレクトリから、すべてのログファイルが自動的に削除されます。このコマンドエントリは出力先を変更しないので、出力先変更文字がコマンド行の *.log の後に追加されて、そのコマンドが正しく実行されるようにしています。


# This command helps clean up user accounts.
1 0 * * 0 rm /home/jones/*.log > /dev/null 2>&1

crontab ファイルを確認する方法

特定のユーザーの crontab ファイルがあるかどうかを確認するには、/var/spool/cron/crontabs ディレクトリで ls -l コマンドを使用します。たとえば、次の表示はユーザー smithjonescrontab ファイルがあることを示しています。


$ ls -l /var/spool/cron/crontabs
-rw-r--r--  1 root     sys          190 Feb 26 16:23 adm
-rw-------  1 root     staff        225 Mar  1  9:19 jones
-rw-r--r--  1 root     root        1063 Feb 26 16:23 lp
-rw-r--r--  1 root     sys          441 Feb 26 16:25 root
-rw-------  1 root     staff         60 Mar  1  9:15 smith
-rw-r--r--  1 root     sys          308 Feb 26 16:23 sys

ユーザーの crontab ファイルの内容を確認するには、crontab -l を使用します。crontab ファイルを表示する方法」を参照してください。

crontab ファイルの表示

crontab -l コマンドは、cat コマンドが他のファイルタイプの内容を表示するのとまったく同様に、使用しているユーザーの crontab ファイルの内容を表示します。このコマンドを使用するために、ディレクトリを (crontab ファイルが入っている) /var/spool/cron/crontabs に変更する必要はありません。

デフォルトでは、crontab -l コマンドは自分自身の crontab ファイルを表示します。他のユーザーの crontab ファイルは、スーパーユーザーでなければ表示できません。

crontab ファイルを表示する方法

  1. (省略可能) root または他のユーザーの crontab ファイルを表示する場合は、スーパーユーザーになります。

  2. 次のように入力して、crontab ファイルを表示します。


    $ crontab -l [username]

    username

    他のユーザーのアカウント名。作成または編集するにはスーパーユーザーの権限が必要 


    注意 - 注意 -

    誤ってオプションを指定しないで crontab コマンドを入力した場合は、使用しているエディタの割り込みキーを押してください。割り込みキーを押すと、変更結果を保存せずに crontab コマンドを終了できます。この時点でファイルの編集を終了して変更結果を保存すると、既存の crontab ファイルが空のファイルで上書きされてしまいます。


例 - crontab ファイルを表示する

次の例で、どのように crontab -l を使用してデフォルトユーザー、デフォルト root、他のユーザーの crontab ファイルを表示するかを示します。


$ crontab -l
13 13 * * * chmod g+w /home1/documents/*.book > /dev/null 2>&1
$ su
Password:
# crontab -l
#ident  "@(#)root       1.19    98/07/06 SMI"   /* SVr4.0 1.1.3.1       */
#
# The root crontab should be used to perform accounting data collection.
#
# The rtc command is run to adjust the real time clock if and when
# daylight savings time changes.
#
10 3 * * 0,4 /etc/cron.d/logchecker
10 3 * * 0   /usr/lib/newsyslog
15 3 * * 0 /usr/lib/fs/nfs/nfsfind
1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean
# crontab -l jones
13 13 * * * cp /home/jones/work_files /usr/backup/. > /dev/null
2>&1

crontab ファイルの削除

デフォルトでは、rm コマンドを使用して誤って crontab ファイルを削除してしまうことがないように、crontab ファイルは保護されています。crontab ファイルを削除する場合は、rm コマンドではなく crontab -r コマンドを使用してください。

デフォルトでは、crontab -r は、このコマンドを実行したユーザーの crontab を削除します。root またはその他のユーザーの crontab を削除するには、スーパーユーザーにならなければなりません。

このコマンドを使用するには、ディレクトリを (crontab ファイルが入っている) /var/spool/cron/crontabs に変更する必要はありません。

crontab ファイルを削除する方法

  1. (省略可能) root または他のユーザーの crontab ファイルを削除するには、スーパーユーザーになります。

  2. 次のように入力して、crontab ファイルを削除します。


    $ crontab -r [username]

    username

    他のユーザーのアカウント名。作成または編集するにはスーパーユーザーの権限が必要 


    注意 - 注意 -

    誤ってオプションを指定しないで crontab コマンドを入力した場合は、使用しているエディタの割り込みキーを押してください。割り込みキーを押すと、変更結果を保存せずに crontab コマンドを終了できます。この時点でファイルの編集を終了して変更結果を保存すると、既存の crontab ファイルが空のファイルで上書きされてしまいます。


  3. crontab ファイルが削除されていることを確認します。


    # ls /var/spool/cron/crontabs
    

例 - crontab ファイルを削除する

次の例では、ユーザー smithcrontab -r コマンドを使用して自分の crontab ファイルを削除します。


$ ls /var/spool/cron/crontabs
adm     jones     lp     root    smith    sys     uucp
$ crontab -r
$ ls /var/spool/cron/crontabs
adm     jones     lp     root    sys    uucp

crontab へのアクセスの制御

cron.denycron.allow という /etc/cron.d ディレクトリ内の 2 つのファイルを使用して、crontab へのアクセスを制御できます。これらのファイルによって、指定したユーザーだけが、それぞれ自分の crontab ファイルの作成、編集、表示、または削除などの crontab 関連操作を実行できるようにします。

cron.deny および cron.allow ファイルは、それぞれ 1 行に 1 ユーザー名が入ったリストからなります。これらのアクセス制御用ファイルは、次のように連携して機能を果たします。

cron.denycron.allow ファイルを編集または作成するには、スーパーユーザーの権限が必要です。

SunOS ソフトウェアのインストール時に、デフォルトで次の cron.deny ファイルが提供されます。


$ cat /etc/cron.d/cron.deny
daemon
bin
smtp
nuucp
listen
nobody
noaccess

上記のすべてのユーザーが、crontab コマンドにアクセスできません。このファイルを編集すれば、crontab コマンドへのアクセスを拒否したいユーザー名を追加できます。

デフォルトでは、cron.allow ファイルは提供されません。つまり、Solaris ソフトウェアのインストール後には、デフォルトの cron.deny ファイルにリストされているユーザー以外のユーザーすべてが crontab にアクセスできます。cron.allow ファイルを作成した場合、そのユーザーだけが crontab コマンドにアクセスできます。

crontab へのアクセスを拒否する方法

  1. スーパーユーザーになります。

  2. /etc/cron.d/cron.deny ファイルを編集し、crontab コマンドを使用させないユーザー名を次のように 1 行に 1 つずつ追加します。


    daemon
    bin
    smtp
    nuucp
    listen
    nobody
    noaccess
    username1
    username2
    username3
    .
    .
    .
  3. /etc/cron.d/cron.deny ファイルを確認します。


    # cat /etc/cron.d/cron.deny
    

crontab へのアクセスを特定のユーザーに限定する方法

  1. スーパーユーザーになります。

  2. /etc/cron.d/cron.allow ファイルを作成します。

  3. 次のように、crontab コマンドの使用を許可するユーザー名を 1 行に 1 つずつ入力します。


    root
    username1
    username2
    username3
    .
    .
    .
    

    このリストには必ず root を追加してください。追加しなければ、スーパーユーザーからの crontab コマンドへのアクセスが拒否されてしまいます。

例 - crontab へのアクセスを特定のユーザーに限定する

次は、ユーザー visitorjonestempcrontab をアクセスさせない cron.deny ファイルの例です。


$ cat /etc/cron.d/cron.deny
daemon
bin
smtp
nuucp
listen
nobody
noaccess
jones
temp
visitor

次は cron.allow ファイルの例です。ユーザー smithjoneslproot だけが crontab にアクセスできます。


$ cat /etc/cron.d/cron.allow
root
jones
lp
smith

制限された crontab へのアクセスを確認する方法

特定のユーザーが crontab にアクセスできるかどうかを確認するには、そのユーザーのアカウントにログインして、crontab -l コマンドを実行します。


$ crontab -l

そのユーザーが crontab にアクセスできて、すでに crontab ファイルを作成している場合は、その crontab ファイルが表示されます。そのユーザーが crontab にアクセスできるが、crontab ファイルがない場合は、次のようなメッセージが表示されます。

(crontab: crontab ファイルを開けません)

このユーザーは、cron.allow (が存在する場合) に含まれているか、cron.deny に含まれていません。

ユーザーが crontab にアクセスできない場合は、上記の crontab ファイルの有無に関わらず、次のメッセージが表示されます。

(crontab: cron を使用許可されていません)

これは、ユーザーが cron.allow (が存在する場合) に含まれていないか、cron.deny ファイルに含まれていることを意味します。

1 つのシステムイベントのスケジューリング (at)

以降の項では、at(1) コマンドを使用してコマンドやスクリプトなどのジョブを後で特定の時刻に実行するようにスケジュールする方法、それらのジョブを削除または表示する方法、および at コマンドへのアクセスを制御する方法について説明します。

デフォルトでは、ユーザーはそれぞれ自分の at ジョブファイルを作成、表示、または削除できます。root または他のユーザーの at ファイルにアクセスするには、スーパーユーザーの権限が必要です。

at ジョブの実行を依頼すると、at ジョブにジョブ識別番号と .a 拡張子が与えられ、それがファイル名になります。

at コマンドの説明

at ジョブファイルを実行するには、次の手順に従います。

  1. コマンド実行時刻を指定して at ユーティリティを起動します。

  2. 後で実行させるコマンドまたはスクリプトを入力します。


    注 -

    このコマンドまたはスクリプトからの出力が重要な場合は、後で調べられるように必ずファイルに書き込むようにしてください。


たとえば、次の at ジョブは、7 月 31 日の真夜中に smith のユーザーアカウントから core ファイルを削除します。


$ at 11:45pm July 31
at> rm /home/smith/*core*
at> Press Control-d
commands will be executed using /bin/csh
job 933486300.a at Sat Jul 31 23:45:00 1999

at コマンドのセキュリティ

特定のユーザーだけがそれぞれの at ジョブに関する待ち行列情報を作成、削除、または表示できるように、at コマンドへのアクセスを制御するファイルを設定できます。at へのアクセスを制御するファイルは /etc/cron.d/at.deny です。ここにはユーザー名が列挙 (1 行に 1 人) されています。このファイルに列挙されているユーザーは、at コマンドにアクセスできません。

Solaris ソフトウェアのインストール時に作成される at.deny ファイルには、次のユーザー名が含まれます。

daemon
bin
smtp
nuucp
listen
nobody
noaccess

スーパーユーザーの特権があれば、このファイルを編集して、at へのアクセスを制限したい他のユーザー名を追加できます。

at ジョブを作成する方法

  1. 次のように、自分のジョブを実行したい時刻を指定して at コマンドを入力し、Return キーを押します。


    $ at [-m] time [date] 

    -m

    ジョブ終了後にメールを送る 

    time

    ジョブをスケジュールしたい時刻の時単位の値。24 時間制を使用しない場合は、am または pm を追加する。midnightnoonnow はキーワードとして使用可能。分単位の値の指定は省略可能

    date

    月または曜日の名前の最初の 3 英字以上、またはキーワード today または tomorrow

  2. at プロンプトに、実行したいコマンドまたはスクリプトを 1 行に 1 つずつ入力します。各行の終わりで Return キーを押すことにより、複数のコマンドを入力できます。

  3. at ユーティリティを終了し、Control-d キーを押して at ジョブを保存します。

    作成できた at ジョブは待ち行列番号を割り当てられ、それがそのファイル名にもなります。この番号は at ユーティリティの終了時に表示されます。

例 - at ジョブを作成する

次の例は、ユーザー jones が彼女のバックアップファイルを 7:30 pm に削除するように作成した at ジョブを示しています。彼女は、ジョブの終了後にメールメッセージを受け取れるように、-m オプションを使用しています。


$ at -m 1930
at> rm /home/jones/*.backup
at> Press Control-d
job 897355800.a at Mon Jul  12 19:30:00 1999

jones は次のメールメッセージを受け取りました。このメッセージは at ジョブが終了したことを確認しています。


Your "at" job "rm /home/jones/*.backup"
completed.

次の例は、jones が大きな at ジョブをどのように土曜日の朝 4:00 にスケジュールしているかを示します。その出力は、big.file に送られます。


$ at 4 am Saturday
at> sort -r /usr/dict/words > /export/home/jones/big.file

at 待ち行列を表示する方法

at 待ち行列で実行を待っているジョブを確認するには、次に示すように atq コマンドを使用します。このコマンドは、その使用者が作成した at ジョブに関する状態情報を表示します。


$ atq

at ジョブを確認する方法

at ジョブが作成できたかどうかを確認するには、atq コマンドを使用します。次の atq コマンドは、jones に属する at ジョブが待ち行列に入っていることを確認しています。


$ atq
  Rank  Execution Date       Owner  Job         Queue   Job Name
  1st   Jul 12, 1999 19:30   jones  897355800.a     a     stdin
  2nd   Jul 14, 1999 23:45   jones  897543900.a     a     stdin
  3rd   Jul 17, 1999 04:00   jones  897732000.a     a     stdin

at ジョブを表示する方法

自分の at ジョブの実行時刻に関する情報を表示するには、次のように at -l コマンドを使用します。


$ at -l [job-id]
-l job-id

状態を確認したいジョブの識別番号 

例 - at ジョブを表示する

次の例は、at -l コマンドからの出力を示しています。このコマンドは、特定のユーザーが依頼したすべてのジョブに関する状態情報を得ることを目的としています。


$ at -l 
897543900.a	Wed Jul 14 23:45:00 1999
897355800.a	Mon Jul 12 19:30:00 1999
897732000.a	Sat Jul 17 04:00:00 1999

次の例は、at -l コマンドに 1 つのジョブを指定して表示された出力を示しています。


$ at -l 897732000.a
897732000.a		Sat Jul 17 04:00:00 1999 

at ジョブを削除する方法

  1. (省略可能) root または他のユーザーの at ジョブを削除する場合は、スーパーユーザーになります。

  2. 次のように入力して、at ジョブを実行される前に待ち行列から削除します。


    $ at -r [job-id]

    -r job-id

    削除したいジョブの識別番号 

  3. at ジョブを削除できたかどうかを確認するには、at -l (または atq) コマンドを使用して at 待ち行列に残っているジョブを表示します。識別番号を指定したジョブは、このリストに現れてはなりません。


    $ at -l [job-id]

例 - at ジョブを削除する

次の例では、ユーザーが 7 月 17 日の午前 4 時に実行されるようにスケジュールした at ジョブを削除しようとしています。まず、このユーザーは at 待ち行列を表示してそのジョブの識別番号を探します。次に、そのジョブを at 待ち行列から削除します。最後に、at 待ち行列をもう一度表示して上記のジョブが削除されていることを確認します。


$ at -l
897543900.a	Wed Jul 14 23:45:00 1999
897355800.a	Mon Jul 12 19:30:00 1999
897732000.a	Sat Jul 17 04:00:00 1999
$ at -r 897732000.a
$ at -l 897732000.a
at: 858142000.a: No such file or directory

at へのアクセスの制御

at.deny ファイルに含まれているユーザーは、at を使用してジョブをスケジュールすることも、at 待ち行列の状態を調べることもできません。

at.deny ファイルは、Solaris ソフトウェアのインストール時にディレクトリ /etc/cron.d に格納されます。そのときに、同じユーザーがこのファイルとデフォルトの cron.deny ファイルの両方に含まれます。


daemon
bin
smtp
nuucp
listen
nobody
noaccess

このファイルを編集するには、スーパーユーザー特権が必要です。

at へのアクセスを拒否する方法

  1. スーパーユーザーになります。

  2. /etc/cron.d/at.deny ファイルを開きます。at コマンドを使用させないようにするユーザー名を 1 行に 1 つずつ追加または削除します。


    daemon
    bin
    smtp
    nuucp
    listen
    nobody
    noaccess
    username1
    username2
    username3
    .
    .
    .

例 - at へのアクセスを拒否する

次は、ユーザー smithjonesat コマンドにアクセスできないように編集された at.deny ファイルの例です。


$ cat at.deny
daemon
bin
smtp
nuucp
listen
nobody
noaccess
jones
smith

at アクセスの拒否を確認する方法

特定のユーザー名が正しく /etc/cron.d/at.deny に追加されているかどうかを確認するには、そのユーザー名でログインして、at -l コマンドを使用します。そのユーザーが at コマンドにアクセスできない場合は、次のメッセージが表示されます。


# su smith
Password:
$ at -l
at: 使用許可されていません

同様に、そのユーザーが at ジョブの実行を依頼しようとした場合は、次のメッセージが表示されます。


$ at 2:30pm
at: 使用許可されていません

これで、そのユーザーが at.deny ファイルに含まれていることが確認されます。

at がコマンドにアクセスできる場合、at -l コマンドは何も返しません。