문제

다음은 CPU로드로 작성하기 위해 작성하는 Bash 스크립트의 스 니펫입니다.

#!/bin/bash
# ... irrelevant nonsense ...
cmd1="/usr/bin/mpstat -P ALL | egrep '(AM|PM)([[:space:]]+)(0)' | tr -s ' ' | cut -d' ' -f4"
ldsys="$(echo $cmd1 | /bin/sh)"
# ... irrelevant nonsense ...

$ldsys 스크립트가 콘솔에서 전통적으로 실행될 때 올바르게 설정됩니다. 황금입니다. 다음은 다음과 같습니다. Crontab과 함께 실행될 때 $ldsys 비었다.

나는 지난 3 시간 동안이 일을하려고 노력하기 위해 수백만 가지를 시도해 왔지만 ... 찾을 수 없어 아무것. 아무도 아이디어가 있습니까?


메모:

  • /usr/bin/mpstat ~할 수 있다 Cron에 의해 실행됩니다. 매 순간 발사하기 위해 가짜 작업을 추가하여 테스트했습니다. /usr/bin/mpstat -P ALL >> somefile 그리고 출력을 확인합니다. 효과가있다.

  • egrep, tr, 그리고 cut 모든 기능은 Cron에서 정상입니다.

  • 나는 그것이 평가 할당 컨벤션과 관련이 있다고 생각하지만 ... 비교적 지원적인 구조라는 점을 고려할 때 왜 그런지 모르겠습니다 ... 아담의 제안을 시도한 후, 나는 이제 어떻게 생각 해야할지 전혀 모른다 ...

편집하다: 벗겨졌다 eval 사용법 ... 여전히 주사위가 없습니다.

도움이 되었습니까?

해결책

당신의 문제가 나옵니다 mpstat. 명령 프롬프트에서 실행되면 AM/PM으로 시간을 출력합니다. 그것이 달릴 때는 그렇지 않습니다 cron. 처럼 Ennuikiller 제안 된 것은 아마도 환경 문제 일 것입니다. 내 시스템에서 echo $LANG 명령 프롬프트에서 "en_us.utf-8"을 제공하지만 실행할 때는 아무것도 없습니다. cron. 이 또는 다른 환경 변수는 그 길에 영향을 미칩니다. mpstat 당신이 때 시간을 출력합니다 grep "(am | pm)"을 위해서는 찾지 못합니다.

그건 그렇고, 당신은 왜 그렇게하지 않는가 :

ldsys=$(/usr/bin/mpstat ... )

"cmd1"에 할당되지 않으면 eval,, echo 그리고 배관 sh?

다른 팁

다음 두 가지 문제 중 하나를 만나고 있습니다.

This is perhaps our number one complaint with cron. When you login to Unix, startup scripts setup your environment. You can see your environment with the commands "printenv" or "env". On the other hand, cron sets up only a sparse environment 

일반적으로 모든 프로그램의 출력은 STDOUT (표준 출력)로 전송되며 일반적으로 누군가의 디스플레이 화면에 감습니다. CRON이 시작한 작업의 경우 STDOUT은 로컬 메일 하위 시스템으로 향합니다.

당신은 제거를 시도 했습니까? eval?

대신에

ldsys=`eval $cmd1`

노력하다

ldsys=`echo "$cmd1" | /bin/sh`

또는

ldsys="$(echo $cmd1 | /bin/sh)"
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top