비 대화식 쉘에서 스크립트를 실행 하시겠습니까?


17

스크립트를 실행하는 크론 작업이 있습니다. 대화 형 쉘을 통해 스크립트를 실행할 때 (bash로 ssh'ed) 정상적으로 작동합니다. 스크립트가 cron을 통해 자체적으로 실행되면 실패합니다.

내 생각에 대화 형 쉘에 설정된 환경 변수 중 일부를 사용하고 있다고 생각합니다. 스크립트 문제를 해결하고 제거하겠습니다.

변경 한 후에는 cron에서 스크립트를 정상적으로 대기열에 넣을 수 있지만 명령 줄에서 스크립트를 실행할 수는 있지만 cron에서와 같이 실행하도록 지시 할 수있는 방법이 있습니까? 즉 비 대화식 환경?


관련 따라서 아마도 도움이 : "어떻게 KSH 쉘에 깨끗한 환경을 얻을 수 있습니까?" 특히 @Gilles의 답변을 참조하십시오 unset.
sr_

1
@의 sr_의 링크에서, 나는 고개를 env, 당신은 시도 할 수 있습니다 env -i ./my-script.sh. 또한 오류 메시지가 표시됩니까?
케빈

어떤 크론 구현을 사용하고 있습니까?
rozcietrzewiacz

@ kevin-당신이 그것에 대답하면 나는 그것을 찬성합니다.
cwd

답변:


12

cron에서 명령을 실행하는 것과 명령 행에서 실행하는 것의 주요 차이점은 다음과 같습니다.

  • cron은 아마도 다른 쉘을 사용하고있을 것입니다 /bin/sh.
  • cron은 분명히 작은 환경에서 실행되고 있습니다 (크론 구현에 따라 다르므로 cron(8)또는 crontab(5)man 페이지를 확인 하십시오. 일반적으로 HOME아마도 SHELL, 아마도 LOGNAME, 아마도 USER작은 것이 있습니다 PATH).
  • cron은 %캐릭터를 특별하게 취급합니다 (개행 문자로 바)).
  • 크론 작업은 터미널 또는 그래픽 환경없이 실행됩니다.

다음 호출은 마치 cron에서 호출 된 것처럼 쉘 스 니펫을 거의 실행합니다. 나는 조각이 문자를 포함하지 않는 가정 '이나 %.

env - HOME="$HOME" USER="$USER" PATH=/usr/bin:/bin /bin/sh -c 'shell snippet' </dev/null >job.log 2>&1

cron에서 sh 스크립트 실행을 참조 하면 문제를 해결하는 데 도움이 될 수 있습니다.


안녕 @ 길레-방금 생각한 것-스크립트 sudo -u user /path/to/script를 실행하는 것도 변수를 설정하지 않고 스크립트 를 실행하는 방법입니까?
cwd

@cwd 아니요, 보통은 아닙니다. sudo일부 변수를 지우고 다른 변수를 알려진 값으로 설정하지만 구성 방법에 따라 다릅니다. TERM예를 들어 로케일 설정을 유지하도록 구성되는 경우가 종종 있습니다 .
Gilles 'SO- 악마 그만'

2

@ sr_의 링크 ( ksh 셸에서 깨끗한 환경을 얻는 방법? )에서 env를 찾은 다음 시도해 볼 수 있습니다.

env -i ./my-script.sh

@Gilles 답변도 정말 좋지만 이것은 잘 작동했습니다.
cwd

@cwd : 작동하지 않습니다 : echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.shoutputs interactive himB.
Alix Axel

1

cron에 넣고 다른 곳에서 사용할 때 스크립트에 절대 경로를 사용하고 스크립트에 사용 된 모든 Linux 명령에 대해 절대 경로를 사용하는 것이 좋습니다. 변수로 선언하고 사용하는 것이 좋습니다!


예. 하지만 물론.
cwd

0

Cron은 반드시 사용중인 것과 동일한 쉘을 사용하지는 않습니다. 검사:

cat /etc/crontab |grep SHELL

쉘을 결정하고 스크립트 실행을 시도하려면 작동합니까? 이것은 많은 사람들이 스크립트를 cron에 추가하는 문제의 일반적인 원인입니다.

이것이 문제라면-cron에서 스크립트 시작 부분에 "bash"를 추가하여이 스크립트가 bash에서 실행되도록 할 수 있습니다. 이렇게해도 문제가 해결되지 않으면 알려 주시면 조금 더 자세히 살펴 보겠습니다.


0

일부 스크립트에서 제공하는 대화 형 질문을 무시하려면 다음을 시도하십시오.

yes | your_command

또는 yes "n"모든 질문을 원하지 않는 경우.

명령:

yes-반복적으로 긍정적 인 yes가되면 expletive 또는 기본적으로 'y'를 영원히 출력합니다.


0

비 대화식 쉘에서 스크립트를 실행하려면 (세부 사항과 무관 cron)를 통해 수행 할 수 있습니다 ssh.

비 대화식 쉘로 끝나는 지 테스트하십시오.

> ssh someuser@somehost tty
not a tty

비 대화식 쉘에서 스크립트를 실행하십시오.

> ssh someuser@somehost /tmp/myscript.sh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.