쉘 스크립트에서 명령의 출력을 확인할 수 있지만 crontab에서는 동일한 작업을 수행할 수 없습니다.

쉘 스크립트에서 명령의 출력을 확인할 수 있지만 crontab에서는 동일한 작업을 수행할 수 없습니다.

우분투 셸에서 스크립트를 .sh 파일로 실행할 수 있지만 cron 작업에서 호출하면 작동하지 않습니다. 우분투 컨테이너에서 스크립트를 실행합니다(docker 사용).

if [ `java -jar /path/to/my.jar |grep -c 'Operation is done successfully.'` -ge 8 ]; then
           echo "yes" 
else echo "no" 
fi

java 명령을 숫자로 올바르게 출력하고 이를 8 및 나머지와 비교합니다. 하지만 이 코드를 crontab에 넣으면 실패합니다. Cron 작업 코드는 다음과 같습니다.

 # Edit this file to introduce tasks to be run by cron.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
JAVA_HOME=/usr/lib/jvm/java-7-oracle
# Each task to run has to be defined through a single line
 * *   *   *   *  if [ `java -jar /path/to/my.jar |grep -c 'Operation is done successfully.'` -ge 8 ]; then echo "yes"; else echo "no";fi

쉘 스크립트 출력은 항상 "yes"이지만 crontab 출력은 항상 "no"입니다. 결과를 캡처하려고 하면

`java -jar /path/to/my.jar |grep -c 'Operation is done successfully.'`

코드에서는 셸에서는 8을 반환하지만 crontab 작업에서는 0을 반환합니다. 종료 코드뿐만 아니라 명령의 출력이 결과로 무엇인지 결정하려면 cron 작업에 뭔가 구성되어야 한다고 생각합니다. env우분투 컨테이너의 출력은 다음과 같습니다.

GIT_PS1_SHOWDIRTYSTATE=1
GREP_COLOR=1;31
MY_DB_ENV_MYSQL_DATABASE=my_db
HOSTNAME=my-core
MY_DB_ENV_MYSQL_ROOT_PASSWORD=mypass
TERM=xterm
CLICOLOR=1
MATCHER_OPTS=[]
LS_COLORS=di=34:ln=35:so=32:pi=33:ex=1;40:bd=34;40:cd=34;40:su=0;40:sg=0;40:tw=0;40:ow=0;40:
SPRING_PROFILES_ACTIVE=production
MY_DB_PORT_3306_TCP_PORT=3306
MY_DB_PORT_3306_TCP=tcp://172.17.0.2:3306
MY_DB_ENV_MYSQL_USER=myuser
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ARTIFACT_ID=unknown
PWD=/data
JAVA_HOME=/usr/lib/jvm/java-7-oracle
AES_DB_ENV_MYSQL_PASSWORD=mypass
PS1=\[\033[40m\]\[\033[33m\][ \u@\H:\[\033[32m\]\w$(__git_ps1 " \[\033[35m\]{\[\033[36m\]%s\[\033[35m\]}")\[\033[33m\] ]$\[\033[0m\]
MY_DB_ENV_MYSQL_VERSION=5.5.42
SHLVL=1
HOME=/root
GREP_OPTIONS=--color=auto
MY_DB_NAME=/my-core/my_db
MY_DB_PORT_3306_TCP_PROTO=tcp
MY_DB_PORT_3306_TCP_ADDR=172.17.0.2
MY_DB_ENV_MYSQL_MAJOR=5.5
MY_DB_PORT=tcp://172.17.0.2:3306
_=/usr/bin/env

env이것이 crontab 에서 일어나는 일입니다.

HOME=/root
LOGNAME=root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/sh
JAVA_HOME=/usr/lib/jvm/java-7-oracle
PWD=/root

왜 이런 일이 일어나는지 말해 줄 수 있는 사람이 있나요? 미리 감사드립니다.

답변1

이 문제를 해결했습니다. 이유는 root사용자가 cron 작업을 실행했기 때문입니다. STDERR을 로그 파일로 리디렉션하여 my.jar파일을 올바르게 실행하려면 추가 .cfg 파일이 필요하다는 것을 발견했습니다. 아시다시피 HOME=/rootcron 에서는 env필요한 .cfg 파일이 /root디렉터리에 있어야 합니다. 그렇지 않으면 즐겨찾는 my.jar파일 .cfg 경로를 식별해야 합니다. .cfg 파일이 지정된 경로에 없으면 my.jar종료 코드는 java -jar my.jar|grep ....0이 됩니다.

관련 정보