다음 재부팅 시 스크립트 실행 및 스크립트 제거

다음 재부팅 시 스크립트 실행 및 스크립트 제거

Ubuntu 16.04를 설치하는 흐름(처음부터 완전 구성까지, 많은 추가 소프트웨어가 설치되고 설치 후 변경 사항이 적용됨)의 일부로 다음 재부팅 후 (설치 중에 다운로드되는) 스크립트를 실행하는 방법이 필요합니다. 다음 재부팅 시에만) 스크립트를 제거하고 다시 재부팅하면 끝납니다.

첫 번째 부팅 후 스크립트를 실행하는 데 사용하는 서비스가 이미 있지만 삭제하지 않고(필요한 경우 나중에 다시 트리거할 수 있음) 나중에 삭제해야 하는 스크립트를 실행해야 한다는 것을 알게 되었습니다. 여기에는 민감한 정보가 포함되어 있습니다.

다른 스크립트에 사용하고 있는 systemd 서비스는 다음과 같습니다.

[Unit]
Description=First run specifics
After=network-online.target
Requires=network-online.target

[Service]
Type=simple
EnvironmentFile=/etc/default/firstrun
ExecStart=/root/bin/firstrun-wrapper "${PASSWORD}"

[Install]
WantedBy=multi-user.target

/etc/default/firstrun 및 /root/bin/firstrun-wrapper는 설치 중에 추가됩니다. /etc/default/firstrun에는 비밀번호가 포함되어 있으며 firstrun-wrapper 스크립트에 의해 삭제되므로 재부팅 후 서비스가 다시 시작되지 않습니다. firstrun-wrapper는 설치 중에 추가된 여러 스크립트를 모두 실행하고 재부팅으로 완료됩니다.

나중에 서비스를 다시 사용하여 동일한 설정을 실행할 수 있습니다(/etc/default/firstrun 파일을 추가하여).

그래서 내 질문은 다음과 같습니다.다음 재부팅 후 스크립트를 실행하고, 실행된 후 스크립트를 제거하고, 스크립트를 제거한 후 재부팅을 트리거하려면 어떻게 해야 합니까?

이것이 systemd를 사용하는지 여부는 나에게 중요하지 않으며 이후에 시스템에 '빈'(관련/민감한 정보가 포함되지 않은 빈 의미) 파일이 남아 있어도 괜찮습니다.

나의 초기 생각은 현재 서비스를 수정하는 것이 었습니다. 나는 특정 파일을 제거하고 더 이상 파일을 포함하지 않도록 firstrun-wrapper를 수정하는 firstrun-wrapper에 또 다른 스크립트를 추가하고 ExecStopPost를 통해 해당 스크립트를 실행할 수 있다고 생각했습니다. 그러나 이는 서비스가 자체적으로 완료되어 트리거되지 않습니다. 말할 수있다). 실행되는 동안 firstrun-wrapper 파일을 수정할 수 있다고 해도 그것이 나쁜 습관이라는 것을 이해하므로 이를 피하려고 노력하고 있습니다.

답변1

crontab -e스크립트를 실행할 사용자에 대해 실행해야 합니다 sudo crontab -e.뿌리또는 sudo -u user_name -ecrontab을 편집하려면사용자 이름. 삽입하세요 @reboot /path/to/file(주의! 빈 새 줄을 잊지 마세요). 스크립트 자체는 다음과 같아야 합니다.

#!/bin/bash
do_your_stuff
# remove from root specific crontab setting all the information about the script
sed -i '/@reboot \/path\/to\/file/d' /var/spool/cron/crontabs/root
# remove the script file itself
rm -- "$0"
# reboot the machine in 2 minutes
shutdown -r +2

이 프로세스를 자동화하려면 Ansible을 사용할 수 있습니다. 다음은 간단한 플레이북의 예입니다. 로컬 호스트에서 실행했습니다.

---
- hosts: localhost
  tasks:
  - name: cron job
    cron:
      name: "a job for reboot"
      special_time: reboot
      job: "/path/to/file"

먼저 플레이북을 실행해야 합니다 root. 그러면 . 재부팅 후 스크립트는 /var/spool/cron/crontabs/root파일 항목 과 마찬가지로 삭제되어야 합니다.@재부팅끈. 루트가 필요하므로 crontab을 완전히 삭제하려면 파일을 자유롭게 수정하세요.

관련 정보