cron 작업이 길이가 0인 파일을 생성하는 이유에 대한 모든 대답은 전형적인 출력 리디렉션을 사용하는 것으로 요약됩니다. 그래도 여전히 도움이 되지 않습니다.
# cat /etc/cron.d/aide
SHELL=/bin/bash
48 22 * * * root /usr/sbin/aide --check >/var/log/dailys/aide-$( date +\%Y\%m\%d ).out 2>&1
길이가 0인 파일만 받게 됩니다. 해당 명령을 가져와 bash 프롬프트에서 실행하면(백슬래시 제거) 채워진 파일을 얻게 됩니다.
업데이트 1
@rudymire내 파일 설명자를 추적하려면 strace를 사용하는 것이 좋습니다. 실패했지만 흥미로운 방식이었습니다.
# cat /etc/cron.d/aide
SHELL=/bin/bash
21 13 * * * root strace /usr/sbin/aide --check >/var/log/dailys/aide-$( date +\%Y\%m\%d ).out 2>/var/log/dailys/strace.out
작업이 실행되고, aide가 출력 없이 실행되고, strace는 파일 설명자 할당이 3으로 시작한다는 것을 보여줍니다. 유일한 참조는 /var/log/dailys
보좌관이 디렉터리에 있는 파일의 권한과 내용을 확인할 때입니다. 그래서 저는 다른 것을 시도했습니다. cron 작업을 시작하고 다양한 프로세스 파일 설명자를 살펴보겠습니다. 결국 모든 일을 끝내기 위해 좀 더 빨리 움직여야 했고,이 트릭주머니에 있던 것이 더 많은 후속 단서를 제공했습니다.
# ps -ef | grep aide
root 27794 27792 <stuff> /bin/bash -c /usr/sbin/aide --check > /var/log/dailys/aide-$( date +%Y%m%d ).out 2>&1
root 27795 27794 <stuff> /usr/sbin/aide --check
# ls -l /proc/27794/fd
lr-x------. <stuff> 0 -> pipe:[14123645]
l-wx------. <stuff> 1 -> pipe:[14123646]
l-wx------. <stuff> 2 -> pipe:[14123646]
# ls -l /proc/27795/fd
lr-x------. <stuff> 0 -> pipe:[14123645]
lrwx------. <stuff> 1 -> /null
lrwx------. <stuff> 2 -> /null
<stuff>
# ls -l /proc/27792/fd
lrwx------. <stuff> 0 -> /dev/null
lrwx------. <stuff> 1 -> /dev/null
lrwx------. <stuff> 2 -> /dev/null
lr-x------. <stuff> 5 -> anon_inode:inotify
lr-x------. <stuff> 6 -> pipe:[14123646]
# ps -ef | grep 27792
root 27792 3850 <stuff> CROND
<stuff>
# ps -ef | grep 3850
root 3850 1 <stuff> crond
<stuff>
따라서 작업자 프로세스의 STDOUT 및 STDERR은 로 전달되고 /null
상위 bash
셸은 에 기록됩니다.그것은부모. 최상위 프로세스에는 CROND
쓰기 가능한 FD가 없습니다. 또한 어떤 프로세스가 /var/log/dailys/aide-20170803.out
먼저 빈 파일을 생성 할지 알 수 없습니다 . 점점 궁금해지네요...
업데이트 2
모든 것은 다음과 같이 시작됩니다DISASTIGRHEL-07-020030, /usr/sbin/aide --check 2>&1 | /bin/mail ...
나는 이것을 테스트했고 그것이 작동한다는 것을 알았습니다. 출력 리디렉션 대신 파이프를 사용하는 이유는 무엇입니까?
메일 버전의 파이프라인으로 돌아가서 PID와 FD를 스캔했습니다. 배쉬 파이핑 배열을 사용하면 aide
FD1과 FD2가 실제로 상위로 돌아가는 대신 파이프를 통해 채워집니다. 그럼 잠시 놀아보자...
# cat /etc/cron.d/aide
SHELL=/bin/bash
41 14 * * * root /usr/sbin/aide --check | tee /var/log/dailys/aide-$( date +%\Y\%m\%d ).out 1>/dev/null 2>&1
aide
이것은 작동합니다... 코드가 파이프를 통하지 않고 출력이 리디렉션되는 것을 막고 있다는 희미한 느낌이 듭니다 . 24시간이 지나면 해결책을 작성하겠습니다.
답변1
selinux를 사용하고 계십니다. "setenforce 0"을 실행하고 cron을 실행하면 예상한 결과를 얻을 수 있습니다. 루트 셸에서 selinux 컨텍스트는 다음과 같습니다.
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
그러나 Cron에서 실행할 때 selinux 컨텍스트는 다음으로 시작됩니다.
system_u:system_r:system_cronjob_t:s0-s0:c0.c1023
|
작동하는 다른 명령으로 다음을 수행할 수도 있습니다.| cat > file
그런 다음 보좌관은 selinux를 사용하여 자체 작업을 수행하므로 리디렉션이 실패합니다.