smartd 데몬(smartmontools)을 생성하고 다음 명령으로 스크립트를 실행했습니다.
DEVICESCAN -a -m email -M test -M exec /usr/share/smartmontools/my-script -n stand...
최상위 명령 출력을 보면 Smartd가 루트로 실행되고 있지만 /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를 다시 시작하면 로그에서 오류가 발견되며 루트로 수동으로 수행하는 것과 달리 이메일이 전송되지 않습니다.
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 파일에 있는 구성 파일입니다. 루트가 아닌 사용자로 실행하면 사용자의 홈 디렉터리에 .mailrc 파일이 없기 때문에 동일한 오류가 발생합니다.
$USER 변수처럼 $HOME 변수를 어떻게 설정합니까? 파일을 찾을 수 없는 이유를 알려줄 수 있습니다.
답변1
마지막 문제는 Arch Linux에서 실행되는 쉘 스크립트에서 호출할 때 mailx
루트 사용자의 파일을 읽을 수 없다는 것 입니다.smartd
systemd
$HOME/.mailrc
이는 다음 요인으로 인해 발생합니다.
mailx
아치 리눅스 에서는달팽이들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