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で実行されているシェルスクリプトから呼び出されたときにmailx
rootユーザーのファイルを読み取ることができないことです。smartd
systemd
$HOME/.mailrc
これは次の要因によって発生します。
mailx
Arch LinuxではカタツムリHOME
、ファイルを検索するときは環境変数に依存します.mailrc
。存在しない場合は、HOME
現在の作業ディレクトリが使用されます。
if((cp = getenv("HOME")) == NULL) cp = "."; /* XXX ユーザーとログインオブジェクト: pw->pw_dir */ homedir = savestr(cp);
systemd
HOME
デバイス設定ファイルにこのオプションが含まれている場合にのみ設定してくださいUser
。
~から生成されたプロセスの環境変数:
$user、$log 名、$HOME、$SHELL
ユーザー名(番号2)、ホームディレクトリ、およびログインシェル。これらの変数は、ユーザーsystemdインスタンスを含むUser =が設定されているデバイスに対して設定されます。
HOME
提供された環境に変数がなく、そのディレクトリで実行されているsmartd
可能性が高いため、ファイルを読み込めませんでした。/
mailx
/root/.mailrc
編集:行を追加
export HOME=~
または
export MAILRC=~/.mailrc
シェルスクリプトを呼び出す前にmailx
または(私はテストしていません)を追加
User=root
デバイス設定ファイルのセクション[Service]
。smartd.service