crontabから電子メールを転送するPOSIX(またはポータブル)方法

crontabから電子メールを転送するPOSIX(またはポータブル)方法

IRIX/Linux/macOS/FreeBSD用のイン​​ストーラ/アップデートスクリプトがあり、その互換性をSolarisに拡張したいと思います。

crontab次のように生成された部分を除き、POSIXと互換性のない部分を修正しました。

printf '%s\n' [email protected] '*/15 * * * * /path/cmd' | crontab -
# crontab -l # (on Linux/macOS/FreeBSD)
[email protected]
*/15 * * * * /path/cmd

メモ: /path/cmd問題が見つからない限り、とても静か

このコードは、次の3つの理由でSolarisで失敗します。

  1. MAILTO=構文エラーの発生
  2. */15構文エラーの発生
  3. crontab -次の名前のファイルを開いてみてください。-

私はそれを解決しました#2そして#サムそして:

printf '%s\n' '0,15,30,45 * * * * /path/cmd' | crontab
# crontab -l
0,15,30,45 * * * * /path/cmd

さて、その部分をどのように変換するのかわかりませんMAILTO=。で電子メールを転送するPOSIXの方法は何ですかcrontab


選択した回避策:

ありがとうこんにちはそして@Gilles 'SO - 邪悪さをやめなさい'ポインター、それが私が決めた方法です。シミュレーションcrontabはMAILTOPOSIX互換の方法で動作します。

# crontab -l
0,15,30,45 * * * * out=$(/path/cmd 2>&1); [ -n "$out" ] && printf \%s\\n "$out" | mailx -s "Cron <$LOGNAME@$(uname -n)>" [email protected]

printfただし、このソリューションには潜在的な問題があります。いいえ内蔵シェルそして出力が大きすぎると、Argument list too long次のエラーで失敗します。

答え1

サポートされていても、これはMAILTOグローバル設定なので、ソフトウェアインストーラには利点はありません。ソフトウェアによって追加されたアイテムだけでなく、crontabのすべてのアイテムにも適用されます。

ソフトウェアが別のアドレスに電子メールを送信できるようにするには、自分のコードでそれを処理する必要があります。これは、終了状態と空の出力のロジックを直接処理する必要があることを意味します。

以下は、このロジックを実装するテストされていないコードです。改行文字を空白に置き換え(または単に削除して)、crontabファイルの1行に入れます。

out=$(mktemp) &&
/path/cmd >"$out" 2>&1;
status=$?;
if [ "$status" -ne 0 ] || [ -s "$out" ]; then
  mailx -s "/path/cmd exited with status $status" [email protected] <"$out";
fi;
rm -- "$out";

コードはPOSIX機能と広く使用されている機能のみを使用します。mktemp。残念ながらIRIXでは使用できません。 IRIXにPOSIX準拠のm4がある場合これを使用して達成できます。mktemp。代替方法として、一時ファイルをユーザーのホームディレクトリの下のどこかに保存することも、他のディレクトリのみが書き込むことができる別のディレクトリに保存することもできます。次のように、共有ディレクトリに予測可能な名前の一時ファイルを作成しないでください/tmpそれは安全ではありません

関連情報