<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Crontab Ssh Execution on K-Life Hack | システムアーキテクチャ &amp; DevOps</title><link>https://klifehack.com/tags/crontab-ssh-execution/</link><description>Recent content in Crontab Ssh Execution on K-Life Hack | システムアーキテクチャ &amp; DevOps</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Tue, 03 Nov 2026 11:00:51 +0900</lastBuildDate><atom:link href="https://klifehack.com/tags/crontab-ssh-execution/index.xml" rel="self" type="application/rss+xml"/><item><title>SSH対話型シェルで成功するスクリプトがcrontabでサイレント失敗する原因と対処構造</title><link>https://klifehack.com/p/crontab-ssh-script-silent-failure/</link><pubDate>Tue, 03 Nov 2026 11:00:51 +0900</pubDate><guid>https://klifehack.com/p/crontab-ssh-script-silent-failure/</guid><description>&lt;p&gt;インフラ構築や運用自動化の過程において、手動でSSHターミナルから実行した際には正常に終了するスクリプトが、&lt;code&gt;crontab&lt;/code&gt;によるスケジューリング実行時には無出力のまま停止、あるいはサイレントに失敗する現象は頻繁に発生します。この問題は、インタラクティブシェルとデモンプロセス経由の非対話型サブシェルにおける初期化ライフサイクルおよび環境変数の不一致に起因します。&lt;/p&gt;
&lt;p&gt;本稿では、&lt;code&gt;cron&lt;/code&gt;実行時の環境分離メカニズムを解説し、絶対パスの強制、ファイル実行権限、およびログリダイレクトストリームの構築手順を整理します。&lt;/p&gt;
&lt;h2 id="ssh対話型環境とcrontab実行環境の構造的差異"&gt;SSH対話型環境とcrontab実行環境の構造的差異
&lt;/h2&gt;&lt;p&gt;手動実行と&lt;code&gt;cron&lt;/code&gt;実行の決定的な違いは、シェル起動時にロードされる環境変数と構成ファイルにあります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+-------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| SSH Interactive Shell Session |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| Load files: ~/.bashrc, ~/.bash_profile, /etc/profile |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| PATH includes: /usr/local/bin, /usr/bin, /bin, user defined paths, etc. |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+-------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+-------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| Cron Daemon Execution Environment |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| Load files: Minimal cron default parameters |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| PATH defaults to: /usr/bin:/bin |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+-------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ユーザーがSSH経由でログインした場合、&lt;code&gt;~/.bashrc&lt;/code&gt;や&lt;code&gt;/etc/profile&lt;/code&gt;などの初期化スクリプトが評価され、拡張された&lt;code&gt;PATH&lt;/code&gt;や独自環境変数が読み込まれます。一方、&lt;code&gt;cron&lt;/code&gt;デモンは最小限の環境変数（多くの場合 &lt;code&gt;PATH=/usr/bin:/bin&lt;/code&gt; のみ）が適用された非対話型サブシェルでジョブを実行します。そのため、標準パス以外の場所に配置されたバイナリや環境変数に依存するスクリプトは探索に失敗します。&lt;/p&gt;
&lt;h2 id="3段階の診断および解決フレームワーク"&gt;3段階の診断および解決フレームワーク
&lt;/h2&gt;&lt;h3 id="1-全コマンドおよびスクリプトへの絶対パス適用"&gt;1. 全コマンドおよびスクリプトへの絶対パス適用
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;cron&lt;/code&gt;設定において相対パスを使用すると、実行時のカレントディレクトリ解釈に不一致が生じ、エラーの原因となります。&lt;/p&gt;
&lt;p&gt;相対パスを用いた失敗例:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-cron" data-lang="cron"&gt;* * * * * python main.py
* * * * * ./scripts/backup.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;絶対パスを明示的に指定した設定例:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-cron" data-lang="cron"&gt;* * * * * /usr/bin/python3 /home/user/project/main.py
* * * * * /bin/bash /home/user/scripts/backup.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;スクリプト内部で相対パスによるファイル読み込み（例: &lt;code&gt;cat ./config.json&lt;/code&gt;）を行っている場合、実行ディレクトリがユーザーのホームディレクトリ（&lt;code&gt;/home/user&lt;/code&gt;）に固定されるためエラーが発生します。必要に応じてスクリプトの先頭で移動処理を挿入するか、フルパスでの記述が必要です。&lt;/p&gt;
&lt;p&gt;バイナリの絶対パスを確認するには、インタラクティブシェルで &lt;code&gt;which&lt;/code&gt; コマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;which python3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;which bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-ファイル実行権限chmodおよびシバンshebangの検証"&gt;2. ファイル実行権限（chmod）およびシバン（Shebang）の検証
&lt;/h3&gt;&lt;p&gt;スクリプトファイルに読取権限があっても実行権限（&lt;code&gt;+x&lt;/code&gt;）が与えられていない場合、&lt;code&gt;cron&lt;/code&gt;は処理を実行できません。&lt;/p&gt;
&lt;p&gt;パーミッション状態の確認:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -l /home/user/scripts/backup.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行権限が付与されていない場合、以下のコマンドで権限を付与します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod +x /home/user/scripts/backup.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、シェルスクリプトの1行目には適切なインタプリタを指定するシバンを明記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-専用ログリダイレクトストリームの実装"&gt;3. 専用ログリダイレクトストリームの実装
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;cron&lt;/code&gt;はデフォルトで標準出力（&lt;code&gt;stdout&lt;/code&gt;）および標準エラー出力（&lt;code&gt;stderr&lt;/code&gt;）をターミナルに表示しません。ローカルMTA（Mail Transfer Agent）が未構成の場合、エラーログは記録されずに破棄されます。&lt;/p&gt;
&lt;p&gt;実行結果およびエラーログをファイルへ連続記録するために、リダイレクト記述を&lt;code&gt;crontab&lt;/code&gt;に追加します。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-cron" data-lang="cron"&gt;* * * * * /bin/bash /home/user/scripts/backup.sh &amp;amp;gt;&amp;amp;gt; /home/user/cron.log 2&amp;amp;gt;&amp;amp;amp;1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;🛠️ &lt;b&gt;ログリダイレクトの構造分解:&lt;/b&gt;
・&lt;code&gt;&amp;gt;&amp;gt; /home/user/cron.log&lt;/code&gt;: 標準出力（ファイル記述子1）をログファイルへ追記形式でリダイレクトします。
・&lt;code&gt;2&amp;gt;&amp;amp;1&lt;/code&gt;: 標準エラー出力（ファイル記述子2）を標準出力と同じストリームへ統合します。&lt;/p&gt;
&lt;h2 id="cron環境変数の明示的宣言と仮想環境の起動"&gt;Cron環境変数の明示的宣言と仮想環境の起動
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;crontab&lt;/code&gt;ファイルの先頭領域にグローバル環境変数を定義することで、個別の実行ラインでフルパス記述を簡略化することが可能です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-cron" data-lang="cron"&gt;PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
SHELL=/bin/bash

* * * * * backup.sh &amp;amp;gt;&amp;amp;gt; /home/user/cron.log 2&amp;amp;gt;&amp;amp;amp;1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pythonの仮想環境（&lt;code&gt;venv&lt;/code&gt; や &lt;code&gt;conda&lt;/code&gt;）を利用するスクリプトを呼び出す場合は、仮想環境内のPythonバイナリパスを直接指定して実行するのが確実な構成方法です。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-cron" data-lang="cron"&gt;* * * * * /home/user/myenv/bin/python /home/user/work/script.py &amp;amp;gt;&amp;amp;gt; /home/user/cron.log 2&amp;amp;gt;&amp;amp;amp;1
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="troubleshooting"&gt;Troubleshooting
&lt;/h2&gt;&lt;h3 id="ケース1-cron実行時の-permission-denied-またはサイレント失敗"&gt;ケース1: cron実行時の Permission Denied またはサイレント失敗
&lt;/h3&gt;&lt;p&gt;⚠️ &lt;b&gt;原因&lt;/b&gt;: 実行スクリプトまたは内部で呼び出すバイナリの権限不足、またはシバン未指定。
💡 &lt;b&gt;対処手順&lt;/b&gt;: &lt;code&gt;chmod +x&lt;/code&gt; による権限の再設定、およびスクリプト先頭行の &lt;code&gt;#!/bin/bash&lt;/code&gt; 存在確認を行ってください。&lt;/p&gt;
&lt;h3 id="ケース2-システムログにcronの実行記録が表示されない"&gt;ケース2: システムログにcronの実行記録が表示されない
&lt;/h3&gt;&lt;p&gt;⚠️ &lt;b&gt;原因&lt;/b&gt;: ディストリビューションの設定によって &lt;code&gt;/var/log/cron.log&lt;/code&gt; 出力が無効化されている。
💡 &lt;b&gt;対処手順&lt;/b&gt;: &lt;code&gt;/etc/rsyslog.d/50-default.conf&lt;/code&gt; を確認し、&lt;code&gt;# cron.*&lt;/code&gt; 行のコメントアウトを解除後、&lt;code&gt;systemctl restart rsyslog&lt;/code&gt; を実行してください。&lt;/p&gt;
&lt;h3 id="ケース3-スクリプト内で参照する外部ファイルの読み込み失敗"&gt;ケース3: スクリプト内で参照する外部ファイルの読み込み失敗
&lt;/h3&gt;&lt;p&gt;⚠️ &lt;b&gt;原因&lt;/b&gt;: &lt;code&gt;cron&lt;/code&gt;実行時のカレント作業ディレクトリが想定と異なる。
💡 &lt;b&gt;対処手順&lt;/b&gt;: スクリプト内部の冒頭に &lt;code&gt;cd &amp;ldquo;$(dirname &amp;ldquo;$0&amp;rdquo;)&amp;quot;&lt;/code&gt; などのパス移動ロジックを組み込むか、参照ファイル全般を絶対パスに変更します。&lt;/p&gt;
&lt;h2 id="システム動作検証ログ"&gt;システム動作検証ログ
&lt;/h2&gt;&lt;p&gt;以下は、パーミッション確認、ログ出力設定、および syslog による &lt;code&gt;CRON&lt;/code&gt; ジョブの動作確認ログ例です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ls -l /home/user/scripts/backup.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- 1 user group 450 Nov 3 10:00 /home/user/scripts/backup.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ chmod +x /home/user/scripts/backup.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ls -l /home/user/scripts/backup.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rwxr-xr-x 1 user group 450 Nov 3 10:01 /home/user/scripts/backup.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ grep CRON /var/log/syslog | tail -n 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Nov 3 10:02:01 server CRON[12345]: (user) CMD (/bin/bash /home/user/scripts/backup.sh &amp;amp;gt;&amp;amp;gt; /home/user/cron.log 2&amp;amp;gt;&amp;amp;amp;1)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Nov 3 10:03:01 server CRON[12411]: (user) CMD (/bin/bash /home/user/scripts/backup.sh &amp;amp;gt;&amp;amp;gt; /home/user/cron.log 2&amp;amp;gt;&amp;amp;amp;1)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ tail -f /home/user/cron.log
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[2026-11-03 10:02:01] Starting backup process...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[2026-11-03 10:02:02] Backup completed successfully.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="operational-notes"&gt;Operational Notes
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;診断領域&lt;/th&gt;
 &lt;th style="text-align: left"&gt;実施項目&lt;/th&gt;
 &lt;th style="text-align: left"&gt;記述・検証構文&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;b&gt;パス定義&lt;/b&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;バイナリおよびターゲットの絶対パス指定&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;/usr/bin/python3 /home/user/project/main.py&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;b&gt;実行権限&lt;/b&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;スクリプトファイルへの実行権限付与&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;chmod +x /home/user/scripts/backup.sh&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;b&gt;ヘッダー定義&lt;/b&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;適切なしバン（Shebang）の明示&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;#!/bin/bash&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;b&gt;出力制御&lt;/b&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;標準出力（1）と標準エラー（2）の結合リダイレクト&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;&amp;amp;gt;&amp;amp;gt; /home/user/cron.log 2&amp;amp;gt;&amp;amp;amp;1&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;b&gt;環境変数&lt;/b&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;crontab -e&lt;/code&gt; 冒頭での &lt;code&gt;PATH&lt;/code&gt; および &lt;code&gt;SHELL&lt;/code&gt; 宣言&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;b&gt;仮想環境&lt;/b&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;venv環境内バイナリの直接指定&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;/home/user/myenv/bin/python&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item></channel></rss>