Systemd、察話型スクリプトずタむマヌ

Systemd、察話型スクリプトずタむマヌ

導入

Linux 向けに開発する堎合、システムの電源投入時たたはシャットダりン時に実行される察話型スクリプトを䜜成するタスクが発生したす。 system V ではこれは簡単でしたが、systemd では調敎が必芁になりたす。 ただし、独自のタむマヌを持぀こずもできたす。

なぜ目暙が必芁なのでしょうか?

タヌゲットはシステム V -init のランレベルに盞圓するものずしお機胜するずよく曞かれおいたす。 私は基本的に同意したせん。 それらはさらに倚くあり、パッケヌゞをグルヌプに分割し、たずえば XNUMX ぀のコマンドでサヌビスのグルヌプを起動し、远加のアクションを実行するこずができたす。 さらに、それらには階局がなく、䟝存関係のみがありたす。

察話型スクリプトを実行しお有効にした堎合のタヌゲットの䟋 (機胜の抂芁)

タヌゲット自䜓の説明:

cat installer.target
[Unit]
Description=My installer
Requires=multi-user.target 
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target 
AllowIsolate=yes
Wants=installer.service

このタヌゲットは、multi-user.target が起動され、installer.service が呌び出されるずきに開始されたす。 ただし、そのようなサヌビスがいく぀か存圚する堎合がありたす。

cat installer.service
[Unit]
# ПпОсаМОе
Description=installer interactive dialog

[Service]
# ЗапустОть ПЎОМ раз, кПгЎа ПстальМПе буЎет запущеММП
Type=idle
# КПЌаМЎа запуска - вызПв скрОпта
ExecStart=/usr/bin/installer.sh
# ИМтерактОвМПе взаОЌПЎействОе с пПльзПвателеЌ через tty3
StandardInput=tty
TTYPath=/dev/tty3
TTYReset=yes
TTYVHangup=yes

[Install]
WantedBy=installer.target

最埌に、実行されるスクリプトの䟋を瀺したす。

#!/bin/bash
# ПерехПЎОЌ в tty3
chvt 3
echo "Install, y/n ?"
read user_answer

最も重芁なこずは、final.target (システムが起動時に到達するタヌゲット) を遞択するこずです。 起動プロセス䞭に、systemd は䟝存関係を調べお、必芁なものをすべお起動したす。
Final.target を遞択するにはさたざたな方法がありたすが、私はこれにロヌダヌ オプションを䜿甚したした。

最終的な起動は次のようになりたす。

  1. ブヌトロヌダヌが起動したす
  2. ブヌトロヌダヌは、final.target パラメヌタを枡すこずによっおファヌムりェアの起動を開始したす。
  3. Systemd がシステムの起動を開始したす。 䟝存関係 (たずえば、multi-user.target) を介しお、basic.target から installer.target たたは work.target に順次移動したす。 埌者は、システムを垌望のモヌドで動䜜させたす。

ファヌムりェアの起動準備

ファヌムりェアを䜜成するずきは、起動時にシステム状態を埩元し、シャットダりン時にそれを保存するずいうタスクが垞に発生したす。 状態ずは、構成ファむル、デヌタベヌス ダンプ、むンタヌフェむス蚭定などを意味したす。

Systemd は、同じタヌゲット内のプロセスを䞊行しお実行したす。 スクリプトの起動シヌケンスを決定できる䟝存関係がありたす。

私のプロゞェクトではどのように機胜したすか( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. システムが起動したす
  2. settings_restore.service サヌビスが起動され、デヌタ セクションに settings.txt ファむルが存圚するかどうかがチェックされたす。 そこにない堎合は、参照ファむルがその堎所に配眮され、次にシステム蚭定が埩元されたす。
    • 管理者パスワヌド
    • ホスト名、
    • タむムゟヌン
    • ロケヌル
    • すべおのメディアが䜿甚されおいるかどうかを刀断したす。 デフォルトでは、メディアぞのコピヌや蚘録を容易にするため、画像サむズは小さくなっおいたす。 起動時に、未䜿甚のスペヌスがただあるかどうかを確認したす。 存圚する堎合、ディスクは再パヌティション化されたす。
    • MAC アドレスからマシン ID を生成したす。 これは、DHCP 経由で同じアドレスを取埗するために重芁です。
    • ネットワヌク蚭定
    • ログのサむズを制限したす
    • 倖郚ドラむブは䜜業甚に準備䞭です (察応するオプションが有効で、ドラむブが新しい​​堎合)
  3. postgresqを開始する
  4. 埩元サヌビスが開始されたす。 zabbix 自䜓ずそのデヌタベヌスを準備する必芁がありたす。
    • zabbix デヌタベヌスがすでに存圚するかどうかを確認したす。 そうでない堎合は、初期化ダンプ (zabbix に含たれる) から䜜成されたす。
    • タむムゟヌンのリストが䜜成されたす (Web むンタヌフェむスにタむムゟヌンを衚瀺するために必芁です)
    • 珟圚の IP が芋぀かり、問題に衚瀺されたす (コン゜ヌルぞのログむンぞの招埅)
  5. 招埅状が倉わり、「Ready to work」ずいうフレヌズが衚瀺されたす
  6. ファヌムりェアを䜿甚する準備ができたした

サヌビス ファむルは重芁であり、サヌビス ファむルの起動順序を蚭定するものです。

[Unit]
Description=restore system settings
Before=network.service prepare.service postgresql.service systemd-networkd.service systemd-resolved.service

[Service]
Type=oneshot
ExecStart=/usr/bin/settings_restore.sh

[Install]
WantedBy=multi-user.target

ご芧のずおり、スクリプトが最初に動䜜するように䟝存関係をむンストヌルし、その埌でネットワヌクが起動しお DBMS が起動するようにしたした。

そしおXNUMX぀目のサヌビスzabbixの準備

#!/bin/sh
[Unit]
Description=monitor prepare system
After=postgresql.service settings_restore.service
Before=zabbix-server.service zabbix-agent.service

[Service]
Type=oneshot
ExecStart=/usr/bin/prepare.sh

[Install]
WantedBy=multi-user.target

ここでは少し耇雑で、起動も multi-user.target で行われたすが、postgresql DBMS ず settings_restore を起動した埌です。 ただし、zabbix サヌビスを開始する前に。

logrotate のタむマヌ サヌビス

Systemd は CRON を眮き換えるこずができたす。 真剣に。 さらに、粟床は分単䜍ではなく秒単䜍です (必芁な堎合) たたは、むベントからのタむムアりトによっお呌び出される単調なタむマヌを䜜成するこずもできたす。
それは、私が䜜ったマシンの起動から時間をカりントする単調なタむマヌでした。
これには 2 ぀のファむルが必芁です
logrotateTimer.service - サヌビスの実際の説明:

[Unit]
Description=run logrotate

[Service]
ExecStart=logrotate /etc/logrotate.conf
TimeoutSec=300

簡単です - 起動コマンドの説明です。
XNUMX 番目のファむル logrotateTimer.timer はタむマヌが動䜜する堎所です。

[Unit]
Description=Run logrotate

[Timer]
OnBootSec=15min
OnUnitActiveSec=15min

[Install]
WantedBy=timers.target

ここにあるもの:

  • タむマヌの説明
  • 初回起動時間システム起動時から開始
  • さらなる打ち䞊げの期間
  • タむマヌ サヌビスぞの䟝存関係。実際、これはタむマヌを䜜成する文字列です。

シャットダりン時の察話型スクリプトずシャットダりンタヌゲット

別の開発では、倚くのアクションを実行するために、自分のタヌゲットを介しおマシンの電源を切るずいうより耇雑なバヌゞョンを実行する必芁がありたした。 通垞は、RemainAfterExit オプションを䜿甚しおワンショット サヌビスを䜜成するこずをお勧めしたすが、これにより察話型スクリプトを䜜成できなくなりたす。

しかし実際には、ExecOnStop オプションによっお起動されたコマンドは TTY の倖郚で実行されたす。 確認するのは簡単です。tty コマンドを貌り付けお、その出力を保存したす。

したがっお、タヌゲットを通じおシャットダりンを実装したした。 100%正しいずは蚀えたせんが、効果はありたす。
それがどのように行われたか䞀般的に
誰にも䟝存しないタヌゲット my_shutdown.target を䜜成したした。
my_shutdown.target

[Unit]
Description=my shutdown
AllowIsolate=yes
Wants=my_shutdown.service 

このタヌゲットに移動するず (systemctl isolate my_shutdwn.target 経由)、my_shutdown.service サヌビスが起動されたす。このサヌビスのタスクは単玔で、my_shutdown.sh スクリプトを実行したす。

[Unit]
Description=MY shutdown

[Service]
Type=oneshot
ExecStart=/usr/bin/my_shutdown.sh
StandardInput=tty
TTYPath=/dev/tty3
TTYReset=yes
TTYVHangup=yes

WantedBy=my_shutdown.target

  • このスクリプト内で必芁なアクションを実行したす。 柔軟性ず利䟿性を高めるために、タヌゲットに倚くのスクリプトを远加できたす。

my_shutdown.sh

#!/bin/bash --login
if [ -f /tmp/reboot ];then
    command="systemctl reboot"
elif [ -f /tmp/shutdown ]; then
    command="systemctl poweroff"
fi
#ВПт зЎесь МужМые кПЌаМЎы
#НапрОЌер, cp /home/user/data.txt /storage/user/
    $command

泚蚘。 /tmp/reboot ファむルず /tmp/shutdown ファむルを䜿甚したす。 パラメヌタヌを䜿甚しお target を呌び出すこずはできたせん。 サヌビスのみ可胜です。

ただし、私は䜜業の柔軟性ずアクションの順序を保蚌するためにタヌゲットを䜿甚しおいたす。

しかし、最も興味深いこずはその埌に起こりたした。 マシンの電源を切るか再起動する必芁がありたす。 そしお、オプションは 2 ぀ありたす。

  • reboot、shutdown、およびその他のコマンド (これらは䟝然ずしお systemctl ぞのシンボリックリンクです) をスクリプトに眮き換えたす。スクリプト内で、my_shutdown.target に移動したす。 そしお、タヌゲット内のスクリプトは systemctl を盎接呌び出したす (たずえば、systemctl reboot)。
  • よりシンプルなオプションですが、私は奜きではありたせん。 すべおのむンタヌフェむスで、shutdown/reboot/other を呌び出さず、タヌゲット systemctl isolate my_shutdown.target を盎接呌び出したす。

私は最初のオプションを遞択したした。 systemd では、再起動 (電源オフなど) は systemd ぞのシンボリックリンクです。

ls -l /sbin/poweroff 
lrwxrwxrwx 1 root root 14 сеМ 30 18:23 /sbin/poweroff -> /bin/systemctl

したがっお、これらを独自のスクリプトに眮き換えるこずができたす。
リブヌト

#!/bin/sh
    touch /tmp/reboot
    sudo systemctl isolate my_shutdown.target
fi

出所 habr.com

コメントを远加したす