我创建了一个 smartd 守护进程 (smartmontools) 按照下面的命令执行的脚本。
DEVICESCAN -a -m email -M test -M exec /usr/share/smartmontools/my-script -n stand...
查看 top 命令输出,Smartd 似乎正在以 root 身份运行,但无法在 /root 中找到配置文件。 $USER、$HOME、whoami、export USER=$(id -u -n) 命令不会回显任何内容,甚至不会回显空行。当在终端中手动执行时,它会按预期打印当前用户名。脚本被 chmod 为 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日志的输出:
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
正如您所提到的,export USER=$(id -u -n) 似乎已经设置了 $USER 变量。 “gmail”是 /root/.mailrc 文件中的配置文件。以非 root 用户身份运行时会产生相同的错误,因为用户主目录中缺少 .mailrc 文件。
如何像 $USER 变量一样设置 $HOME 变量?这可能会告诉您为什么找不到该文件。
答案1
您的最终问题是,当在 Arch Linux 上从由 运行、启动的mailx
shell 脚本调用时,没有读取 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
。
从生成的进程中的环境变量:
$用户、$日志名称、$HOME、$SHELL
用户名(两次)、主目录和登录 shell。这些变量是为设置了 User= 的单元设置的,其中包括用户 systemd 实例。
HOME
由于提供给 的环境中没有变量smartd
,并且它很可能是在该/
目录中启动的,mailx
因此没有读取该/root/.mailrc
文件。
修复方法:添加行
export HOME=~
或者
export MAILRC=~/.mailrc
在调用 shell 脚本之前mailx
或(未经我测试)添加
User=root
到您的单元配置文件[Service]
的节。smartd.service