<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title><![CDATA[ タグ「cron」を含む投稿［1件］ - でんげき☆ Network Service ]]></title>
	<link>https://room.dengeki.jp/tegalog.cgi</link>
	<description><![CDATA[ Raspberry Pi 4 で運用実験中 ]]></description>
	<language>ja</language>
	<copyright>Copyright 2025</copyright>
	<lastBuildDate>Thu, 05 Jun 2025 14:05:45 +0900</lastBuildDate>
	<generator><![CDATA[ <!-- てがろぐ Version: -->Powered by <a href="https://www.nishishi.com/cgi/tegalog/" rel="noreferrer" target="_top">てがろぐ</a> Ver 4.4.5 ]]></generator>
	<!-- BEGIN ENTRIES -->
	<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ スケジュール実行 cron は 13 日の金曜日の夢を見るか… ]]></title>
	<description><![CDATA[ スケジュール実行 cron は 13 日の金曜日の夢を見るか？<br /><img class="embeddedimage " width="240" height="240" src="https://room.dengeki.jp/images/20211211080738-admin.png" alt="20211211080738-admin.png"><br />　<br />「〇〇〇〇は△△△△の夢を見るか？」ってフレーズを見かけるとなんかえっちな気分になっちゃう！って光栄マイコンシステムのストロベリーなんとか世代のひいおじいちゃんが云ってたけど…自称：ゆとりのない平成のゆとり的なオレ様的にはしょーみなンてるんか全く意味わかんないですｗ　まじまじｗｗｗ<br />まぁそんな茶番はおいといて…諸々の bot 大好きな人々に愛されるスケジュール実行の cron についての諸々です<br /><br />cron - daemon to execute scheduled commands (Vixie Cron)<br />スケジュールされたコマンドを実行するデーモンって事らしいですね（機械翻訳<br /><br />このスケジュールの確認・設定をするには crontab なるコマンドを使います<br />スケジュールの確認 <span class="decorationC" style="color:green;">crontab -l</span><br />スケジュールの設定 <span class="decorationC" style="color:green;">crontab -e</span><br /><br />設定の初回起動時のみ使用するエディタを聞かれるらしい？　なおこの使用するエディタは以下のコマンドで再設定できるようです<br /><span class="decorationC" style="color:green;">select-editor</span><br /><br />Select an editor. &nbsp;To change later, run &apos;select-editor&apos;.<br />&nbsp; 1. /bin/ed<br />&nbsp; 2. /bin/nano&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;<span class="decorationC" style="color:red;">&lt;---- easiest</span><br />&nbsp; 3. /usr/bin/vim.tiny<br /><br />Choose 1-3 <span class="decorationC" style="color:red;">&#91;2&#93;</span>: <br /><br />なんか「<span class="decorationC" style="color:red;">&lt;---- easiest</span>」と「<span class="decorationC" style="color:red;">&#91;2&#93;</span>」ってのが現在設定されているエディタっぽく見えるけどそうじゃなくて…何も入力せずに Enter した時に選択されるデフォルト値を表示しているようです　紛らわしいですね(-_-；)<br /><br />　　：<br /><br />では実際に <span class="decorationC" style="color:green;">crontab -e</span> して設定してみましょう<br />新たなスケジュールを設定する場合は…新しい行として以下の書式を追加します<br /><br /><span class="decorationC" style="color:green;">* * * * * コマンド</span><br /><br />5 個並んだ「*」は順番に… 分 時 日 月 曜日 を指しています<br />「*」は設定可能な全ての値になってるんで…上記の「* * * * * コマンド」は <b class="decorationB">全ての分</b> の <b class="decorationB">全ての時</b> の <b class="decorationB">全ての日</b> の <b class="decorationB">全ての月</b> の <b class="decorationB">全ての曜日</b> って意味となり「毎分(だいたい 0 秒くらい)にコマンドを実行」となります<br />もうちょっと細かく設定した例っていうか…<br /><br /><span class="decorationC" style="color:green;">1 * * * * コマンド</span><br />毎月の毎日の毎時の 1 分にコマンドを実行<br /><br /><span class="decorationC" style="color:green;">1 2 * * * コマンド</span><br />毎月の毎日の 2 時 1 分にコマンドを実行<br /><br /><span class="decorationC" style="color:green;">1 2 3 * * コマンド</span><br />毎月の 3 日の 2 時 1 分にコマンドを実行<br /><br /><span class="decorationC" style="color:green;">1 2 3 4 * コマンド</span><br />4 月 3 日の 2 時 1 分にコマンドを実行<br /><br />曜日は少々特殊な扱いになってるってるんでアレだけど…例えば<br /><span class="decorationC" style="color:green;">* * * * 6 コマンド</span> もしくは<br /><span class="decorationC" style="color:green;">* * * * sat コマンド</span> で毎月の<b class="decorationB">毎土曜日</b>の毎時の毎分にコマンドを実行します<br />数字と曜日は 0=sun, 1=mon, 2=tue, 3=wed, 4=thu, 5=fri, 6=sat, 7=sun に対応しています　大文字小文字は関係ないようです<br /><br />　　：<br /><br />もっと細やかな設定をしてみましょう　例えば勤務時間内にありがちな設定っていうか 8 時から 17 時までの毎時 0 分にコマンドを実行するって例だと…<br /><span class="decorationC" style="color:green;">0 8,9,10,11,12,13,14,15,16,17 * * * コマンド</span><br /><span class="decorationC" style="color:green;">0 8-17 * * * コマンド</span><br />設定したい内容を「,(カンマ)」で区切って列挙するとか「-(ハイフン)」で 8 から 17 までって感じで指定します<br /><span class="decorationC" style="color:green;">0 8-12,13-17 * * * コマンド</span><br />こんな感じで範囲指定を列挙することもできるようです<br /><br />ただし分なり時なりの境い目をまたいで設定する場合には注意が必要です　例えば毎時の 50 分から次の 10 分までって場合だと…<br /><span class="decorationC" style="color:green;">50-10 * * * * コマンド</span><br />この指定では動きません　この場合だと…<br /><span class="decorationC" style="color:green;">50-59,0-10 * * * * コマンド</span><br />こんな感じで途中に「,(カンマ)」を入れて区切ってやらないとダメなようです　ちなみに「,(カンマ)」で列挙する場合には数の大小の順番は関係ないらしいです<br /><br />　　：<br /><br />さらに細やかな設定をしてみましょう　例えば（どのような状況でそのような必要があるのかイマイチ思い浮かばないけど）偶数日（2 で割り切れる日）の 10 時 20 分のみコマンドを実行するって例だと…<br /><span class="decorationC" style="color:green;">20 10 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30 * * コマンド</span><br /><span class="decorationC" style="color:green;">20 10 2-30/2 * * コマンド</span><br />こんな感じで指定できます　まぁ「全ての偶数日」って事なんで「2-30/2」なんて指定じゃなく「*/2」でもイケるようです<br />ちなみに「全ての奇数日」ってしたいのあれば「1-31/2」って感じになるみたいです<br />　　：<br /><br />月初にコマンドを実行したい時っていうか月初は 1 日に決まってるんでその辺は簡単だってことで…じゃぁ月末にコマンドを実行したい時はどうしたらいいんでしょうか<br />カレンダーをざっと眺めて 12 ヶ月分の設定を用意しとけば…って「あーでも 2 月の月末は 28 日だけじゃなくてうるう年とかどうしよう！！」ってなるんでもうちょっと手の込んだ設定でどうにかしてみましょう<br />この場合っていうか cron の設定だけでは毎月の月末を判定することはできません　なので<b class="decorationB">コマンド側</b>でその辺をどうにか対処してみます<br /><br /><span class="decorationC" style="color:green;">* * 28-31 * * /usr/bin/test $(/bin/date -d &apos;+1 day&apos; +%d) -eq 1 && コマンド</span><br />いきなりややこしい感じになって申し訳ないかんじで（汗<br />これは月末としてなり得る 28 日 から 31 日にかけて <span class="decorationC" style="color:green;">/bin/date</span> に「翌日」を出力させた後に <span class="decorationC" style="color:green;">/usr/bin/test</span> でそれが「月初」を意味する「1」であるかを判定して「1」であれば <span class="decorationC" style="color:green;">&&</span> でくっつけたコマンドを実行するって意味になります<br /><br />cron 内での使用に限った話じゃないけど…この <span class="decorationC" style="color:green;">&&</span> でコマンドを並べると「直前のコマンドが正常終了した場合に次のコマンドを実行」って動作をします　例えば Web サイトの証明書の更新コマンドを実行して…それが成功して更新コマンドが正常終了した時のみ Web サーバを再起動するなんて処理を 1 行にまとめて書けるんで便利だと思います<br /><br />　　：<br /><br />そんな感じの複雑な判定を求められるスケジュール設定っていうか…少し特別動作をする「曜日」の設定についての注意事項を少々<br />例えば「13 日の金曜日の 0 時 0 分にコマンドを実行」なんてありがちなスケジュール設定をしたいと思いました<br /><span class="decorationC" style="color:green;">0 0 13 * fri コマンド</span><br />これでバッチリだぜ！！(&gt;_&lt;)ｗって思いたい所ですが…これでは思った動作をしません<br />これだと「毎月の 13 日」と「毎月の金曜日」の両方でコマンドが実行されてしまします<br /><br />何となくこれまで見てきた cron の動作的に「設定した項目の全てに合致した AND 的な動作」を期待しがちなんだけど…「日の設定」と「曜日の設定」に関しては「どちらか一方でも合致したら動く OR 的な動作」になってしまうようです　※ただし「*」での設定は除く<br /><br /><span class="decorationC" style="color:green;">0 0 13 * * /usr/bin/test $(/bin/date +\%w) -eq 5 && コマンド</span><br /><span class="decorationC" style="color:green;">0 0 * * fri /usr/bin/test $(/bin/date +\%d) -eq 13 && コマンド</span><br />そんな 13 日の金曜日を判定するには上記のように設定します<br />※ 0=sun, 1=mon, 2=tue, 3=wed, 4=thu, 5=fri, 6=sat, 7=sun<br /><br />前者は<b class="decorationB">毎月の 13 日</b>に <span class="decorationC" style="color:green;">/bin/date</span> を使って曜日を出力させてそれが<b class="decorationB">金曜日かどうか</b>を判定する手法<br />後者は<b class="decorationB">毎月の金曜日</b>に <span class="decorationC" style="color:green;">/bin/date</span> を使って日付を出力させてそれが<b class="decorationB"> 13 日かどうか</b>を判定する手法です<br />後者の手法は「毎月の金曜日」って感じで月に 4〜5 回ほど動作することになって無駄が多いんで…この場合は前者の「毎月の 13 日」って設定の方が好ましいと思います<br /><br />　　：<br /><br />あと cron の設定でミスりやすい点と云うかコマンドや入出力に使用するファイルへのパスですかね<br />コマンドというかスクリプトを作ってる時にありがちなんだけど…どこかのフォルダをカレントディレクトリに設定してスクリプトをテストしていて「できた！さぁ cron に設定しよう！」ってしたら思った動作をしない時があるんですよね<br />これは cron が実行するカレントディレクトリが往々にしてテストしていたフォルダと違う事により指定したファイルを読めない・書けないって事が原因にあるようです<br />なので cron で実行されるコマンド（スクリプト）はフルパスで指定して…かつ読み書きするファイルなどもフルパスで設定する必要があります　うっかりしてるとやらかしがちなミスなんで注意していきタイネ！<br /><br />※なお今回紹介した <span class="decorationC" style="color:green;">/usr/bin/test</span> と <span class="decorationC" style="color:green;">/bin/date</span> のパスは我が家でのもので…環境によって違う場合があるので事前に which コマンド等で調べてから使用してください <a href="https://room.dengeki.jp/tegalog.cgi?tag=%52%61%73%70%62%65%72%72%79%20%50%69" class="taglink" title="Raspberry Pi">#&#91;Raspberry Pi&#93;</a> <a href="https://room.dengeki.jp/tegalog.cgi?tag=%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%83%98%e3%83%ab%e3%83%97" class="taglink" title="コマンドヘルプ">#コマンドヘルプ</a> <a href="https://room.dengeki.jp/tegalog.cgi?tag=%63%72%6f%6e" class="taglink" title="cron">#cron</a> -- Posted by 猫山ぽるか 〔3967文字〕 No.12 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=12</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=12</guid>
	<category>info</category>
	<pubDate>Sat, 11 Dec 2021 08:07:38 +0900</pubDate>
</item>

	<!-- END ENTRIES -->
</channel>
</rss>

