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のログインシェルだと思い込んでた・・・