それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

crontab はどのシェルコマンドで実行されるのか?

crontabはbashで実行されるの?

はい、基本的にはshです・・・ただ、いつもshとは限らない

shで実行される。

crontab はユーザー単位で管理される。ただし、ユーザのSHELL変数に依存する。

また、ログインやtty の確保を行わないようなので、パイプは使えない。.profile が読み込まれることもなさそうだ。

システムの cron は /bin/sh で実行される。

/etc/crontab が システムのcron の入り口で これが/bin/sh と決まってる。

/etc/crontab で、SHELL=/bin/sh が指定されていて、 /etc/crontab システムcron設定を起動するように作られている。したがってSHELLを上書きしない限り /bin/sh

/etc/crontab

takuya@atom:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly

うっかり書き換えると大変そうだけど、書き換えると便利そうでもある。

bashにしたい。

SHELL=/bin/bash

とかいて、SHELL変数で上書きします。

または、pam を使って pam_env ( PAMについては面倒だから記述しない)で変数を指定できる PAM使うくらいならSHELL変数で指定したら楽だよね。

本当に sh で実行されてるの?

SHELL変数を上書きできたかどうかは、cronのメールを見ると確認できます。

From: root@atom (Cron Daemon)
To: takuya@atom
Subject: Cron <takuya@atom>  /home/takuya/bin/some_command.sh
Content-Type: text/plain; charset=UTF-8
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/takuya>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=takuya>
Message-Id: <E1XXpjS-00034y-Pa@atom>
Date: Sat, 27 Sep 2014 20:00:06 +0900
Status: RO

(略

ヘッダに書いているSHELLが実行時のSHELLをみると SHELL=/bin/sh なので shですね。

補足 2014-10-10 修正

英語の流し読み間違えてた。。。。 /etc/passwd SHELLが出てきたからてっきり /etc/passwdのログインシェルだと思い込んでた・・・