0

コンソール(tty)からバッチを実行した際には問題なかったが、cron登録では実行されないときの原因と対処方法

ちょっとしたバッチをcronで運用しようとした時に起きた
トラブル、その原因、解決方法から解像度を上げていきます。

●症状

コンソールからバッチを実行した際には問題なし。
cron登録では実行されない。

実行しているバッチでエラーが出ていないかを確認する為、
ログを出力する様に変更(2>&1)

ちなみに該当のcronはこんな感じ

●crontab -l

00 23 * * * /home/mysql/tools/full-backup.sh >> /var/log/mysql/mysql-backup.log.`date +%Y%m%d` 2>&1

何がおこっているかを確認
cron登録し、バッチ走行後、
下記の内容がログに出力されていた。

***HOGEHOGE CHECK START***
2015年  9月  6日 日曜日 01:30:01 JST
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
sudo: sudo を実行するには tty がなければいけません。すみません
- - - - - - - - - - - - - - - - - - - - - - - - - - - -

すみません…って

●原因

/etc/sudoersの設定でtty(コンソール *1)とつながってない仮想ターミナルからのsudoが禁止されていた。

デフォルトでttyなしの sudo が許可されてないことが多いようで、sshで sudo付きコマンドを実行されるのを防ぐ思想の元のようです。
そういえば、chef、ansibleでcron動かす時もこの設定をかました事を思い出しました 汗
なんのことはなかったわけですが、本件から解像度UP図りましょう。
少しでも悩んでる人の救いとなるべく、未来の為に書き続けます。。

*/etc/sudoers を直接編集しないこと。visudo コマンドを使いましょう*

# visudo
      ・

    〜 中略 〜

      ・
53 # Disable "ssh hostname sudo ", because it will show the password in clear.
54 #         You have to run "ssh -t hostname sudo ".
55 #
56 Defaults    requiretty

      ・

      ・

Defaults requiretty をコメントアウトすることで、
本事象は解決しますが、
これでは少し荒すぎで、セキュリティが弱すぎます。

今回は、該当バッチ実行ユーザに限り、sudoにttyでの実行要求をしない設定にしました。

53 # Disable "ssh hostname sudo ", because it will show the password in clear.
54 #         You have to run "ssh -t hostname sudo ".
55 #
56 #Defaults    requiretty        # ttyでない場合はsudoさせない(コメントアウト)
57 Defaults:hachim-batch    !requiretty # ユーザhachim-batchはttyでなくてもsudo可能
58 hachim-batch ALL=(ALL) NOPASSWD:ALL  # ユーザhachim-batchはsudoにパスワード不要

以上です。

*1
tty → コンソールターミナル(物理的に直接サーバへ繋げ、コンソール接続している状態)
pts → 仮想ターミナル(telnet や SSH 等のターミナルソフトで繋げている状態)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です