Re: cronで逆シングルクォーテーションを使いたい
nojimaです。
manmos@stellar.co.jp (Hideo "Sir MaNMOS" Morishita) writes:
> > Redhat7.1 を使っています。
> > crontab -e で以下のコマンドを書きました。(よくあるパターンだと思います!
> > ?)
> > 0-59/5 * * * * (date; free; df; ps -ef) > /tmp/hoge.`date +'%m%d-%H%M'`
> >
> > これをコマンドラインから実行すると正しく動くのですが、cron 登録すると
> > /bin/sh: -c: line 1: unexpected EOF while looking for matching ``'
> > /bin/sh: -c: line 2: syntax error: unexpected end of file
> > って怒られちゃうんです。
> >
> > P.S.
> > 察しの通り、利用者から「ある時間帯に急に重くなる!!」と言われたので考えた
> > スクリプトです。他に良い方法があればご教示願います。
>
> 一度shell scriptにしてそれを呼び出すのが正しい。
上の見解に激しく同意します。crontabの内部の行には大したことはあまり
書けないと思った方がよいです。
自分もcronのコマンド行の挙動で良くわからなくなることが多々あり、困るので
調べました。RHL9のcronであるvixie-cron-3.0.1(vixie-cron-3.0.1-74.src.rpm)を
読むと、
1. man 5 crontab すればわかるとおり、ソース内部でも%文字単体は問答無用で
コマンドの区切とみなされる。
(do_command.c child_process()の実装)
2. \%については、
・sh -cに渡される部分(最初の%よりも前の文字列)は\%のまま渡される
(\が取り除かれてsh -cに渡されたりはしない)
・最初の単体の%以降(コマンドの標準入力として渡るデータ)では、
a) \% は %のみに変換されて渡される
b) %は\nに変換されて渡される
c) \'%以外の文字'は\'%以外の文字'のまま渡される。
(do_command.c child_process()の実装)
3. '\+改行'でcrontabの行の次の行にコマンドの続きを書く等
は全く出来無い。とにかく一行にしか書けない。
(misc.c get_string(),entry.c load_entry()の実装)
となります。以上1〜3より、
a) プログラムの構造上簡単なコマンドぐらいしかcrontabには書けない
ので、ちょっと複雑なこと書こうと思ったらシェルスクリプトにした方が良い。
b) コマンドに'%'混っていたらシェルスクリプトにしないとRHL9のcronでは
意図どおりに動作しない。(\%してcronの解釈をエスケープできるが、sh -cに
\%がそのまま渡ってしまう)
c) 実行されるかどうかの挙動が良くわからなければ、
sh -c 'crontabのコマンド部分に書いたものをそのまま書く'
で実行できるか調べてみると良い場合もある
(勿論ですが、-cに指定するのは%前までのコマンド部分です。また、
カレントディレクトリ、PATH/HOME等の環境変数が異なる場合があります
ので完全な事前テストにはなりませんが)
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735