쉘 .sh 스크립트는 수동으로 실행하지 않는 한 모든 작업을 수행하지 않습니다.

쉘 .sh 스크립트는 수동으로 실행하지 않는 한 모든 작업을 수행하지 않습니다.

재부팅 시 쉘 스크립트를 실행하여 이를 crontab에 넣습니다.

@daily apt-get update && apt-get upgrade -y
@reboot bash /root/Start.sh
@reboot /bin/bash -c 'sleep 10 && /bin/mount -a'
...

셸 스크립트는 다른 .py 스크립트를 성공적으로 시작했기 때문에 실행되지만 내부에서 모든 스크립트(Trouble.py 제외)를 시작하지는 않습니다.

그러나 쉘 스크립트를 직접 실행하면 다음과 같습니다. bash Start.sh

.sh의 모든 스크립트가 실행됩니다.

이것은 내 쉘 스크립트입니다.

sleep 15
python3 /root/.../trouble.py > /root/error_log_bash.txt
python3 /root/.../working1.py &
python3 /root/.../working2.py &

내가 지금까지 시도한 것 :

  • .sh의 순서 변경
  • 수면 전과 후의 수면 시간이 다릅니다
  • chmod +x .py 스크립트
  • 또 다른 유사한 스크립트를 실행했는데 예상대로 작동했습니다.
  • error_log_bash.txt를 확인했지만 비어 있습니다.
  • .sh에서 sudo 시작

다른 스크립트와 함께 사용하고 있어서 스크립트에 문제가 있는 것인지 궁금합니다. 그러나 수동으로 작업하기 때문에 이것을 상상하기는 어렵습니다. 내가 뭐 놓친 거 없니? 이 행동을 유발할 수 있는 요인은 무엇입니까? 저는 데비안을 루트로 사용하고 있습니다.

#Edit @Waltinator cron과 일반 환경의 차이점을 지적해 주셔서 감사합니다. 수동 콘솔을 사용하여 bash /root/Start.sh 대신 sh /root/Start.sh를 실행하면 오류가 발생하지 않습니다.

답변1

이것은 답변이라기보다 댓글에 가깝지만 댓글에 줄이 너무 많습니다.

  1. 귀하의 경우에 달성하고자 하는 것이 전혀 명확하지 않습니다. 작동하지 않는다고 설명했지만 원하는 것은 아닙니다.
  2. 귀하가 작성한 코드의 인터프리터를 식별해야 하는 스크립트의 첫 번째 줄이 누락되었습니다. 귀하의 경우에는 #!/bin/sh이것으로 충분할 수 있습니다 .
  3. 넌 못 잡았어표준 에러에서 출력됩니다 trouble.py. 이것은 문제가 될 수도 있고 아닐 수도 있지만, 잡아보지 않으면 알 수 없습니다.
  4. 두 백그라운드 작업의 출력을 전혀 캡처하지 않습니다.
  5. 스크립트에서 오류 출력을 캡처하지 않습니다. 예를 들어, python3찾을 수 없으면 유용한 출력을 얻을 수 없습니다.

다음은 샘플 교체 스크립트입니다.

#!/bin/sh
sleep 15
python3 /root/.../trouble.py  >/root/trouble.log 2>&1
python3 /root/.../working1.py >/root/working1.log 2>&1 &
python3 /root/.../working2.py >/root/working2.log 2>&1 &

다음은 모든 출력을 보내는 것에 대한 대안입니다(표준 출력그리고표준 에러스크립트와 세 가지 Python 프로그램의 경우)를 단일 파일로trouble.log

#!/bin/sh
sleep 15
exec >/root/trouble.log 2>&1

python3 /root/.../trouble.py
python3 /root/.../working1.py &
python3 /root/.../working2.py &

그런 다음 스크립트를 실행 가능하게 만듭니다. 호출하면 괜찮 runit습니다 chmod a+rx runit. 이제 다음과 같은 경로를 통해 스크립트를 실행할 수 있습니다./root/runit

관련 정보