Ubuntu 18.04를 종료/다시 시작할 때 명령 실행

Ubuntu 18.04를 종료/다시 시작할 때 명령 실행

[내 구성] Ubuntu 18.04 - digitalocean Droplet/Server

[배경] 내 연구에 따르면 /etc/network/intefaces는 18.04부터 더 이상 사용되지 않으며 netplan이라는 것이 도입된 것으로 추측됩니다. 데스크탑은 NetworkManager를 사용하고 서버 Netplan은 제어권을 systemd-networkd에 전달합니다.

[질문] 종료/다시 시작 시 실행할 스크립트를 가져옵니다. /etc/network/interfaces에서 pre-up/post-down을 사용하려고 계획했지만 위의 이유로 인해 작동하지 않습니다.

특히 제가 실행하려는 스크립트는 종료 및 재부팅 시 iptables를 저장하고 복원하는 것과 관련이 있습니다.

[iptables-percious] iptables-percious를 설치하라고 요청하지 마세요. 이 경우에도 iptables를 버퍼와 같은 별도의 파일에 저장하고 복원해야 하기 때문입니다. iptables-persist가 파일을 다른 위치에 저장하고 재부팅 시 로드할 수 있다면 고려해 보겠습니다.

어떤 아이디어가 있나요?

[노력했어요]

  1. 결과 없이 /etc/NetworkManager/dispatcher.d/01firewall에 실행 파일을 만들었습니다. 위에서 언급한 것처럼 서버 설치 시 NetworkManager를 사용하지 않기 때문인가요?

  2. /lib/systemd/system/에 서비스를 만들었습니다.

    [Unit]
    Description=ipres
    
    [Service]
    ExecStart=/bin/sh -c '/sbin/iptables-save -c > /etc/blah/firewall/up.save'
    ExecStop=/bin/sh -c '/sbin/iptables-save -c > /etc/blah/firewall/down.save'
    
    [Install]
    WantedBy=multi-user.target
    

    파일이 생성되었지만 비어 있기 때문에 부분적으로 성공했습니다(iptables-save가 너무 늦게/너무 일찍 실행되기 때문입니까?)

답변1

마지막으로 파일에서 이 서비스 정의를 사용했습니다 /etc/systemd/system/ipres.service.

[Unit]
  Description=ipres
  Wants=network-online.target
  After=network.target auditd.service
  ConditionPathExists=/etc/mypath

[Service]
  Type=oneshot
  RemainAfterExit=yes
  ExecStart=/usr/local/bin/my.program load
  ExecStop=/usr/local/bin/my.program save

[Install]
  WantedBy=basic.target

그리고 my.program을 사용했습니다 /usr/local/bin/my.program(chroot 읽기 및 쓰기)이와 같이:

#!/bin/sh

    case $1 in
    load)
        #Do some stuff
    ;;
    save)
        #Do some stuff
    ;;
    *)
        echo "Invalid action '$1'"
    ;;
    esac

서비스를 시작하고 활성화하는 것을 잊지 마십시오.

systemctl enable ipres.service && systemctl start ipres.service

나 한테 딱이야.

답변2

서버에서 명령을 수동으로 실행하고 다음을 사용하여 서비스를 활성화했습니까?

systemctl 활성화 <서비스 이름>.service

기본 설치를 사용하여 우분투 16.04 및 18.04에서 서비스 파일을 사용해 보았는데 모든 것이 잘 작동하는 것 같습니다.

관련 정보