ラッパーを利用して安全にcronを更新する。crontab -r は無効化。

ラッパーを利用して安全にcronを更新する。crontab -r は無効化。

crontabコマンドには恐ろしいオプションがあります。通常crontabを触る時は、"crontab -e" で編集、"crontab -l" で設定確認の2つがメインですが、-e と間違えて "crontab -r" と打ってしまうと設定済みのcronが全て消えてしまいます。

なのでcronの更新には、"crontab -e" はできる限り使わないほうが良いと思います。じゃあどうするかという事になります。

別のcron更新方法

crontabコマンドは、-e で編集モードに入る以外の方法で更新することも可能です。それは引き数にファイルを指定する方法です。おそらくこの方法を使うのがベターでしょう。

$ crontab file

こういった形です。ちなみに僕の場合は、~/.config/cron に設定ファイルを置いているので

$ [sudo] crontab ~/.config/cron/username [-u username]

とかこういった形になります。少なくともこうすることで、少なくとも "crontab -e" を使うことがなくなるので安全性が高まります。

スポンサーリンク
スポンサーリンク

crontabのラッパーコマンドを利用する

より安全性を高めるにはラッパーコマンドを作成し利用する方法があります。そしてラッパーでは "-r" を完全に無効化してしまえば安全です。以下はその具体例です。mycrontabとしてパスの通った所に保存します。

<span style="color: #546D7A;">#</span><span style="color: #546D7A;">!/bin/</span><span style="color: #C792EA;">bash</span><span style="color: #546D7A;">
</span>
<span style="color: #546D7A;">## </span><span style="color: #546D7A;">crontab wrapper
</span>
<span style="color: #74CBC4;">PATH</span>=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$<span style="color: #74CBC4;">PATH</span>
<span style="color: #74CBC4;">argv</span>=(<span style="color: #C2E982;">"$@"</span>)

<span style="color: #FF516D;">cronedit</span> () {
  crontab -e $<span style="color: #74CBC4;">OPT</span>
}

<span style="color: #FF516D;">cronview</span> () {
  crontab -l $<span style="color: #74CBC4;">OPT</span>
}

<span style="color: #FF516D;">cronfile</span> () {
  crontab $<span style="color: #74CBC4;">OPT</span>
}

<span style="color: #FF516D;">alertmsg</span> () {
  <span style="color: #74CBC4; font-weight: bold;">echo</span> <span style="color: #C2E982;">"----------------------------------------------------------"</span>
  <span style="color: #74CBC4; font-weight: bold;">echo</span> <span style="color: #C2E982;">"if you use \"crontab -r\", you will be almost dead."</span>
  <span style="color: #74CBC4; font-weight: bold;">echo</span> <span style="color: #C2E982;">"----------------------------------------------------------"</span>
}

<span style="color: #FF516D;">helpmsg</span> () {
  <span style="color: #74CBC4; font-weight: bold;">echo</span> <span style="color: #C2E982;">"Usage: mycrontab [-f file (overwrite)|-l (view)|-e (edit)|-r (loose time)|-u user]"</span>
}

</span><span style="color: #C792EA;">for</span> ARG<span style="color: #C792EA;"> in</span> <span style="color: #C2E982;">"$@"</span>
<span style="color: #C792EA;">do</span>
  <span style="color: #C792EA;">case</span> $<span style="color: #74CBC4;">ARG</span><span style="color: #C792EA;"> in</span>
    -h|<span style="color: #C2E982;">'help'</span>|-help|--help)
      helpmsg
      <span style="color: #C792EA;">exit</span>
      ;;
    -u)
       <span style="color: #C792EA;">for</span> i<span style="color: #C792EA;"> in</span> <span style="color: #74CBC4;">`seq 0 $(($# - 1))`</span>
       <span style="color: #C792EA;">do</span>
         <span style="color: #C792EA;">if</span> [ ${<span style="color: #74CBC4;">argv</span>[$<span style="color: #74CBC4;">i</span>]} = <span style="color: #C2E982;">"-u"</span> ]; <span style="color: #C792EA;">then</span>
           <span style="color: #C792EA;">if</span> [[ -z ${<span style="color: #74CBC4;">argv</span>[$<span style="color: #74CBC4;">i</span>+1]} ]] || [[ ${<span style="color: #74CBC4;">argv</span>[$<span style="color: #74CBC4;">i</span>+1]} =~ ^-+ ]]; <span style="color: #C792EA;">then</span>
             <span style="color: #74CBC4; font-weight: bold;">echo</span> <span style="color: #C2E982;">"&#12300;${argv[$i]}&#12301;&#12458;&#12503;&#12471;&#12519;&#12531;&#12395;&#12399;&#24341;&#25968;&#12364;&#24517;&#35201;&#12391;&#12377;"</span> 1&gt;&amp;2
             <span style="color: #C792EA;">exit</span> 1
           <span style="color: #C792EA;">else</span>
             <span style="color: #74CBC4;">OPT</span>+=<span style="color: #C2E982;">" -u ${argv[$i+1]}"</span>
           <span style="color: #C792EA;">fi</span>
         <span style="color: #C792EA;">fi</span>
       <span style="color: #C792EA;">done</span>
      ;;
    -e)
      <span style="color: #74CBC4;">FLG_E</span>=1
      ;;
    -f)
      <span style="color: #74CBC4;">FLG_F</span>=1
      <span style="color: #C792EA;">for</span> i<span style="color: #C792EA;"> in</span> <span style="color: #74CBC4;">`seq 0 $(($# - 1))`</span>
      <span style="color: #C792EA;">do</span>
        <span style="color: #C792EA;">if</span> [ ${<span style="color: #74CBC4;">argv</span>[$<span style="color: #74CBC4;">i</span>]} = <span style="color: #C2E982;">"-f"</span> ]; <span style="color: #C792EA;">then</span>
          <span style="color: #C792EA;">if</span> [[ -z ${<span style="color: #74CBC4;">argv</span>[$<span style="color: #74CBC4;">i</span>+1]} ]] || [[ ${<span style="color: #74CBC4;">argv</span>[$<span style="color: #74CBC4;">i</span>+1]} =~ ^-+ ]]; <span style="color: #C792EA;">then</span>
            <span style="color: #74CBC4; font-weight: bold;">echo</span> <span style="color: #C2E982;">"&#12300;${argv[$i]}&#12301;&#12458;&#12503;&#12471;&#12519;&#12531;&#12395;&#12399;&#24341;&#25968;&#12364;&#24517;&#35201;&#12391;&#12377;"</span> 1&gt;&amp;2
            <span style="color: #C792EA;">exit</span> 1
          <span style="color: #C792EA;">else</span>
            <span style="color: #74CBC4;">OPT</span>+=<span style="color: #C2E982;">" ${argv[$i+1]}"</span>
          <span style="color: #C792EA;">fi</span>
        <span style="color: #C792EA;">fi</span>
      <span style="color: #C792EA;">done</span>
      ;;
    -l)
      <span style="color: #74CBC4;">FLG_L</span>=1
      ;;
    -r)
      alertmsg
      <span style="color: #C792EA;">exit</span>
      ;;
    *)
  <span style="color: #C792EA;">esac</span>
<span style="color: #C792EA;">done</span>

<span style="color: #C792EA;">if</span> [ <span style="color: #FFCB6B; font-weight: bold;">!</span> -z $<span style="color: #74CBC4;">FLG_F</span> ]; <span style="color: #C792EA;">then</span>
  cronfile $<span style="color: #74CBC4;">OPT</span>
<span style="color: #C792EA;">else</span>
  <span style="color: #C792EA;">if</span> [ <span style="color: #FFCB6B; font-weight: bold;">!</span> -z $<span style="color: #74CBC4;">FLG_L</span> ]; <span style="color: #C792EA;">then</span>
    cronview $<span style="color: #74CBC4;">OPT</span>
  <span style="color: #C792EA;">elif</span> [ <span style="color: #FFCB6B; font-weight: bold;">!</span> -z $<span style="color: #74CBC4;">FLG_E</span> ]; <span style="color: #C792EA;">then</span>
    cronedit $<span style="color: #74CBC4;">OPT</span>
  <span style="color: #C792EA;">fi</span>
<span style="color: #C792EA;">fi</span>

<span style="color: #C792EA;">exit</span>

:

mycrontabの利用法

ほぼ通常のcrontabと同様です。

crontabの設定確認は

$ mycrontab -l

ユーザーを指定する場合は

$ sudo mycrontab -u hoge -l

編集モードに入るには下記で。もしユーザーを指定する場合は上記の確認時と同様です。

$ [sudo] mycrontab -e [-u hoge]

またファイルから更新する場合は "-f ファイル名" と指定します。

$ [sudo] mycrontab -f ファイル名 [-u hoge]

簡単な使い方は "–help" でいつでも確認できます。

$ mycrontab --help

ちなみに誤って "mycrontab -r" と打っても削除はされないので安心です。こんな感じでcrontabをラッパーに置き換えてしまえば誤った操作で時間をロスする事が無くなるかと思います。

設定ファイルはリポジトリに

補足ですが、cronなどの設定ファイルはgitなどのリポジトリに入れて管理しておくのがベターかと。誤って消した時だけでなく、何か間違えて設定した時もバージョン管理されていれば過去の状態に戻せますし。