crontab에서 어떤 쉘을 사용하고 있는지 어떻게 알 수 있나요?
예를 들어 출력을 리디렉션하려는 경우 &> 또는 >&(bash 대 csh)를 사용해야 하는지 어떻게 알 수 있나요?
답변1
에서 crontab(5)
:
여러 환경 변수는 cron(8) 데몬에 의해 자동으로 설정됩니다. SHELL은 /bin/sh로 설정되고, LOGNAME 및 HOME은 crontab 소유자의 /etc/passwd 라인에서 설정됩니다. HOME 및 SHELL은 crontab의 설정을 통해 무시할 수 있습니다.
답변2
이는 사용 중인 버전 cron
과 구성 방법에 따라 다르지만 일반적으로 yes 입니다 /bin/sh
. 일반적으로 다른 항목에 대한 심볼릭 링크이지만 ls -l /bin/sh
.
다음과 같은 cron 항목을 추가할 수 있습니다.
* * * * * ps -p $$ > /tmp/shelltest
또는 ( /etc/crontab
을 통해 각 사용자의 crontab에 항목을 추가하는 대신 편집하는 경우 crontab -e
):
* * * * * username ps -p $$ > /tmp/shelltest
/tmp/shelltest
출력에서 셸의 파일 이름을 알려줍니다 . cron
출력이 메일로 전송되도록 설정 권한이 있는 경우 >/tmp/shelltest
메일로 정보 가져오기를 건너뛰고 대신 파일에 넣을 수 있습니다.
다음과 같이 더 복잡합니다.
* * * * * ls -l /proc/`ps -p $$ | tail -n 1 | xargs | cut -f 1 -d \ `/exe > /tmp/shelltest
사용된 정확한 파일을 알려주어야 합니다. 일반적인 Debian 시스템에서는 다음과 같은 결과가 발생합니다.
lrwxrwxrwx 1 dspillett dspillett 0 Mar 14 16:17 /proc/1356/exe -> /bin/dash
이 인스턴스에서는 cron이 dash
기본 셸로 사용됨을 보여줍니다.
이 명령을 분석하려면 다음을 수행하십시오.
ps -p $$
현재 프로세스(즉ps
, 상위 프로세스)의 세부 정보를 인쇄합니다. 이 경우에는 셸이 됩니다.tail -n 1
ps
포함된 헤더 줄을 제거하세요.- 파이핑 스루(Piping through)는
xargs
줄의 선행 공백을 잘라내는 트릭입니다. - 호출은
cut
이와 같이 첫 번째 필드에서 구분 기호가 공백인 필드를 가져옵니다(\와 백틱 사이에 공백을 포함하는 것이 절대적으로 중요합니다). - 백틱으로 묶고 외부 명령줄의 출력(프로세스 ID여야 함)을 포함하면 다음과 같이 됩니다.
ls -l /proc/9999/exe
여기서 "9999"는 읽은 프로세스 ID이며, 이는 프로세스를 생성하는 데 사용된 파일을 나열합니다.ps
'/proc' 파일 시스템에 <pid>로 식별된 프로세스의 실행 파일에 대한/proc/<pid>/exe
링크가 있기 때문입니다.- (동일한 작업을 수행하는 더 깔끔한 방법이 있을 수 있습니다. 이는 기억에서 입력한 것이므로 의견을 통한 제안을 환영합니다!)