루비를 cron으로 실행하는 스크립트로 이동할 준비

이 기사에서 쓰기



Ruby를 지금까지 움직이지 않았던 환경에서, cron에서 실행하는 shell Script로 호출하고 싶을 때에 무엇이 필요했는지 잊지 않도록 써 둔다.

이 기사에서 쓰지 않는 것



어떻게 ruby를 install하는가? 그리고 install 때까지 주저하기 쉬운 오류와 같은 사례별 해결 단계.
이 기사에서 쓰고 싶은 것은 어디까지나 cron에서 실행되는 shell script에서 실행 환경을 정돈하는 부분입니다.
미리 양해 바랍니다.

참고로 해 주신 분들의 링크집 감사합니다.


  • 쉘 스크립트에서 rbenv에서 루비를 실행하고 싶습니다 | Hatena 블로그
  • cron 환경 변수 정보 | Qiita
  • rbenv shell 명령 정보 | rbenv의 Github README
  • cron 설정 가이드

  • 현장의 팀 멤버 여러분에게도 도와 주셨습니다.

    실행 환경


    $ cat /etc/redhat-release
    CentOS release 6.2 (Final)
    

    결론



    다음 세 가지를 수행해야했습니다.
  • 루비 넣기
  • shell script에서 루비를 명시 적으로로드합니다.
  • cron에서는 독자적인 PATH가 읽혀지기 때문에, cron에 ruby를 읽어들일 수 있도록 path를 통과시킨다.

  • 1. 우선 루비를 넣는다.



    이번에는 rbenv를 통해 도입했다.
    자세한 내용은 Github rbenv | README를 참조하십시오.
    $ ruby -v
    ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
    

    루비가 들어간 것을 확인할 수 있었습니다.

    실행하고 싶은 스크립트 이미지



    test_ruby.sh
    #!/bin/bash
    
    ruby test.rb
    

    실행할 cron 설정

    crontab
    00 12 * * * /bin/bash /home/user_name/test_ruby.sh > /home/user_name/log/test_ruby.log 2>&1
    

    이것으로, 「갈 수 있을 것이다!」라고 생각하고 있었습니다.

    실행할 수 없었습니다.



    /home/user_name/log/test_ruby.log
    /home/user_name/test_ruby.sh: line 3: ruby: command not found
    

    왜. . 라고 생각했습니다.
    다음에서 대응해야 할 항목의 2와 3에 대해 씁니다.

    2. 쉘 스크립트에서 루비를 명시 적으로로드합니다.



    원래 rbenv는 어디에 있는지 확인.
    $ which rbenv
    /home/user_name/.rbenv/bin
    

    그래서 스크립트를 수정하는 방법.

    test_ruby.sh
    export PATH="$HOME/.rbenv/bin:$PATH"
    eval "$(rbenv init -)"
    rbenv shell 2.7.1
    ruby -v
    

    다시 실행하면,
    $ /bin/bash /home/user_name/test_ruby.sh
    ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
    

    왔다!

    여기서 선배 엔지니어의 중얼거림이 분보에 도착했습니다.
    🐈 「cronはPATHが独自だった気がする」
    

    맞습니다. 단지 shellscript의 실행은 아니고, cron 경유로의 실행입니다.
    즉, 여행은 아직 도중이었습니다.

    3. cron에서는 독자적인 PATH가 읽히기 때문에, cron에 ruby를 읽어들일 수 있도록 path를 통과시킨다.



    원래 PATH가 어떻게 되어 있는지, /etc/crontab를 확인.

    /etc/crontab
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    HOME=/
    # For details see man 4 crontabs
    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  * user-name command to be executed
    

    과연. 확실히, rbenv에의 PATH가 등록되어 있지 않다.
    /etc/crontab를 변경하는 것이 옳은지 어떨지 모르겠지만, 이번에는 crontab -e에서 PATH 선언을 추가했습니다.

    crontab
    PATH=/sbin:/bin:/usr/sbin:/usr/bin:/home/user_name/.rbenv/bin
    

    움직이는지 확인.



    crontab
    01 15 * * * /bin/bash /home/user_name/test_ruby.sh > /home/user_name/log/test_ruby.log 2>&1
    

    이런 식으로 시도를 cron을 통해 실행하려고했습니다.

    실행 후
    $ less /home/user_name/log/test_ruby.log
    
    ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
    

    제대로 ruby를 사용할 수있는 상태가 된 것을 확인할 수있었습니다!

    마지막으로



    틀린 곳 등 있으시면 코멘트에서 지적해 주시면 감사하겠습니다.
    읽어 주셔서 감사합니다.

    좋은 웹페이지 즐겨찾기