Bash 스크립트의 파이프는 제대로 작동하지만 crontab에서는 동일한 스크립트가 실패합니다.

Bash 스크립트의 파이프는 제대로 작동하지만 crontab에서는 동일한 스크립트가 실패합니다.

(저에게) 이상한 동작이 발생했습니다. 더 큰 스크립트를 작성했는데 잘 작동합니다. crontab 정의 작업에서 스크립트를 실행하려고 하면 다음 줄로 인해 문제가 발생합니다.

down_ubuntu14=https://cloud-images.ubuntu.com/trusty/current/
ubuntu14=trusty-server-cloudimg-amd64-disk1.img
Ubuntu14_Date_Web=$(wget -qO- $down_ubuntu14 | grep $ubuntu14 | awk '{print $8 $9}' | sed -e "s/<.*>/ /g" | cut -d">" -f2 | awk '{print $2}')

마지막 줄에서는 특정 다운로드 대상에 대한 날짜를 얻기 위해 다운로드 사이트를 제거했습니다.

soi       5076  5075  0 09:35 ?        00:00:00 wget -qO- https://cloud-images.ubuntu.com/trusty/current/
soi       5077  5075  0 09:35 ?        00:00:00 grep trusty-server-cloudimg-amd64-disk1.img
soi       5078  5075  0 09:35 ?        00:00:00 awk {print $8 $9}
soi       5079  5075  0 09:35 ?        00:00:00 sed -e s/<.*>/ /g
soi       5080  5075  0 09:35 ?        00:00:00 cut -d> -f2
soi       5081  5075  0 09:35 ?        00:00:00 awk {print $2}

파이프가 개행을 일으키거나 문자열의 각 부분을 단일 프로세스로 시작하는 것처럼 보입니다.

귀하의 답변과 조언에 진심으로 감사드립니다. 좀 더 정확한 예를 들어보려고 노력했습니다.

다음과 같은 짧은 스크립트를 설정하면:

down_ubuntu14=https://cloud-images.ubuntu.com/trusty/current/
ubuntu14=trusty-server-cloudimg-amd64-disk1.img
Ubuntu14_Date_Web=$(wget -qO- $down_ubuntu14 | grep $ubuntu14 | awk '{print $8 $9}' | sed -e "s/<.*>/ /g" | cut -d">" -f2 | awk '{print $2}')
echo $Ubuntu14_Date_Web | tee /tmp/test
echo "Just another test line"  | tee -a /tmp/test

SSH 콘솔에서 실행하면 테스트 파일에 다음이 표시됩니다.

cat /tmp/test
14-Jun-2018
Just another test line

crontab에 다음 줄을 입력합니다.

20 6 * * *      /home/soi/scripts/test.sh

이제 cron에 의해 스크립트가 시작되고 프로세스 목록에서 다음을 볼 수 있습니다.

soi       6508  6507  0 06:20 ?        00:00:00 /bin/sh -c /home/soi/scripts/test.sh
soi       6509  6508  0 06:20 ?        00:00:00 wget -qO- https://cloud-images.ubuntu.com/trusty/current/
soi       6510  6508  0 06:20 ?        00:00:00 grep trusty-server-cloudimg-amd64-disk1.img
soi       6511  6508  0 06:20 ?        00:00:00 awk {print $8 $9}
soi       6512  6508  0 06:20 ?        00:00:00 sed -e s/<.*>/ /g
soi       6513  6508  0 06:20 ?        00:00:00 cut -d> -f2
soi       6514  6508  0 06:20 ?        00:00:00 awk {print $2}

...그리고 로그 파일 /tmp/test에 공백 하나만 기록합니다. 로그에 다음 내용만 기록합니다.

cat /tmp/test
Just another test line

이 문제의 주된 이유를 이해하지 못합니다. 누군가가 여기에 깨달음을 가져올 수 있기를 바랍니다.

답변1

대부분의 cron 구현은 프로세스가 포함된 셸을 시작하지 않고 대신 셸을 사용하여 파이프를 구문 분석하고 두 프로세스를 별도로 실행합니다. script.sh에 명령을 추가하고 cron에서 호출하면 작동합니다.

답변2

적어도 그것은 Linux 설치에만 해당되는 것 같습니다. 나는 이 스크립트를 5개의 다른 컴퓨터와 Linux 버전에서 시험해 보았는데 어디에서나 잘 작동합니다. 그래서 우리는 상자를 다시 설치하기로 결정했습니다.

여러분의 지원과 아이디어에 진심으로 감사드립니다. 매우 감사합니다.

건배, 프랭키

관련 정보