次回の再起動時にスクリプトを実行し、スクリプトを削除する

次回の再起動時にスクリプトを実行し、スクリプトを削除する

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"

まず、プレイブックを実行する必要があります。これは、のcronタスクを更新しますroot。再起動後、スクリプトは/var/spool/cron/crontabs/rootファイルエントリと同様に削除される必要があります。@リブート文字列。ルートに必要な crontab を完全に削除するためにファイルを自由に変更できます。

関連情報