Smartdが実行されると、シェルスクリプトは空の$ USER変数を印刷します。

Smartdが実行されると、シェルスクリプトは空の$ USER変数を印刷します。

smartdデーモン(smartmontools)を作成し、次のコマンドでスクリプトを実行しました。

DEVICESCAN -a -m email -M test -M exec /usr/share/smartmontools/my-script -n stand...

トップレベルのコマンド出力を見ると、Smartdはrootとして実行されていますが、/ rootに設定ファイルが見つからないようです。 $USER, $HOME, whoami,export USER=$(id -u -n) コマンドは何も、空行もエコーしません。端末で手動で実行すると、現在のユーザー名が期待どおりに印刷されます。スクリプトは700に変更されました。

なぜこれが起こるのですか?

編集:これは私が実行したい実際のスクリプトです。

#!/bin/sh

export USER=$(id -u -n)
echo $whoami
echo "USER: "
echo "$USER"
echo $HOME

EMAIL_EXEC="mailx"
EMAIL_ACCOUNT="gmail"
EMAIL_SUBJECT="simplified"
EMAIL_BODY="simplified"

echo "$EMAIL_BODY " | $EMAIL_EXEC -A $EMAIL_ACCOUNT -s "$EMAIL_SUBJECT" [email protected]

smartdを再起動すると、ログにエラーが検出され、手動でrootとして実行するのとは異なり、電子メールは送信されません。

sudo systemctl restart smartd
journalctl -u smartd

これはJournalctl logの出力です。

Test of /etc/smartmontools/run.d/email to [email protected] produced unexpected output (69 bytes) to STDOUT/STDERR:
USER:
root
Account `gmail' does not exist.
No mail for root

言及したように、エクスポートUSER = $(id -u -n)はすでに$ USER変数を設定しているようです。 "gmail"は/root/.mailrcファイルにある設定ファイルです。 root以外のユーザーとして実行すると、ユーザーのホームディレクトリに.mailrcファイルがないため、同じエラーが発生します。

$USER変数のように$HOME変数をどのように設定しますか?ファイルが見つからない理由を教えてください。

ベストアンサー1

最後の問題は、Arch Linuxで実行されているシェルスクリプトから呼び出されたときにmailxrootユーザーのファイルを読み取ることができないことです。smartdsystemd$HOME/.mailrc

これは次の要因によって発生します。

  • mailxArch LinuxではカタツムリHOME、ファイルを検索するときは環境変数に依存します.mailrc。存在しない場合は、HOME現在の作業ディレクトリが使用されます。
  if((cp = getenv("HOME")) == NULL)
      cp = "."; /* XXX ユーザーとログインオブジェクト: pw->pw_dir */
  homedir = savestr(cp);

$user、$log 名、$HOME、$SHELL

ユーザー名(番号2)、ホームディレクトリ、およびログインシェル。これらの変数は、ユーザーsystemdインスタンスを含むUser =が設定されているデバイスに対して設定されます。

HOME提供された環境に変数がなく、そのディレクトリで実行されているsmartd可能性が高いため、ファイルを読み込めませんでした。/mailx/root/.mailrc

編集:行を追加

export HOME=~

または

export MAILRC=~/.mailrc

シェルスクリプトを呼び出す前にmailx

または(私はテストしていません)を追加

User=root

デバイス設定ファイルのセクション[Service]smartd.service

おすすめ記事