오랜만에 글을 작성한다. 

     

      적을건 엄청 많지만... 지금은 때가 아니라서 잠시 참고있지만, 조금만 있으면 게시물이 많이 늘어날 것으로 예상하고 있다. 

     



      임베디드 시스템에서 장치를 종료할 때 특장 장치때문에 커널 패닉이 나거나 또는 hang이 발생되는 경우가 종종 있다. 필자도 emmc에 오류가 발생했는지 부트로더에서 무한 리부팅을 발생시켰다. 다행히 해결방법을 찾긴 했는데, 좀 더 쉽게 해결할 수 있는 것이 없을 까하여 인터넷을 뒤졌는데, 정작 완벽한 해결 방법이라기 보다 활용가능성이 있어보여 메모해 둔다. 


      최근 리눅스들은 systemd에서 장치의 시작과 끝을 맞이한다. 예전 레드햇계열의 리눅스에만 보면 rc를 이용하는데 반해 사실 좀더 머리아픈것 같기도 하고 생각한데로 안움직이면 갑갑함이 느껴지긴 하지만 어쩔수 없으니...

     

    1. 종료 처리 내용 작성
      종료처리할 때 실행할 기능들을 담은 스크립트를 생성한다. 

    # cat > /etc/custom_script.sh
    #!/bin/sh
    echo "Pre-Reboot for custom board."
    for i in {1..3}; do
        sleep 10
        echo "."
    done

     

     

     


    2. 퍼미션 설정
      서비스에서 사용가능하도록 퍼미션을 설정한다.

    # chmod u+x /etc/custom_script.sh

     

     

    3. 서비스파일 생성
      다음은 systemd에 의해서 실행될 유닛 파일(서비스)을 생성한다. 디스크립션은 설명이고, 의존성은 없고, shutdown.target 전에 한번 실행되며, 스크립트는 custom_script.sh이고 바로 실행되도록 설정한다. 

    # cat > /etc/systemd/system/pre-reboot-custom.service
    [Unit]
    Description=pre-reboot-custom service
    DefaultDependencies=no
    Before=shutdown.target

    [Service]
    Type=oneshot
    ExecStart=/etc/custom_script.sh
    TimeoutStartSec=0

    [Install]
    WantedBy=shutdown.target

     

     

     


    4. 서비스 데몬을 재로드

      서비스 파일도 생성했겠다. 기존 서비스 데몬을 재로드하여 등록할 준비를 해둔다.

    # systemctl daemon-reload

     

     

    5. 서비스 등록 및 시작

      마지막으로 서비스를 시작한다. 

    # systemctl enable pre-reboot-custom.service

     

     

    6. 결과확인
      확인하려면 reboot이나 shutdown을 실행하면된다. 실행 결과를 한번 살펴보고 마무리해보자. 두눈 크게 뜨고 생략된 글자를 보면 필자가 만든 서비스임을 확인할 수 있다. 

     

     

      pre-reboot (종료처리용) 서비스 만들기 끝.

     

     

    추가로 레퍼런스는 아래의 웹사이트를 이용하였다. 많은 내용이 있으니 필요시 참고하기 바란다. 

     

    https://www.golinuxcloud.com/run-script-with-systemd-before-shutdown-linux/

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기