複数のアプリケーションをインストールおよび構成するために使用するサービス単位ファイルがあり、シャットダウン時にシステムを再起動する必要があります。このスクリプトをsysVinitスクリプトからcentOS 7.1のsystemDに移行しようとしていますが、システムログイン画面でスクリプトが完了するのを待つことはできません。
以前と後にsysinit.target、basic.target、network-online.targetを必須By、WantedByに設定しようとしましたが、再起動が完了するまでログイン画面をブロックすることはありません。
この問題を解決した人、またはどのサービスがログイン画面を制御しているのかを知っている人はいますか?
答え1
これを行う1つの方法は、使用している他のサービスの前にサービスを開始するように指定することですBefore=
。この場合、GUIがなく、コンソールログインを防止したいので、使用する必要があります[email protected]
。 (ただし、パラメータ化されたサービスなので、注意してください。この場合、次の部分は@
実行するデバイスを表しますgetty
。)
[Unit]
Description=Run script to set up environment
[email protected] [email protected] [email protected] [email protected] [email protected] [email protected]
[Service]
Type=oneshot
ExecStart=/bin/myscript
getty
これにより、TTY 1-6から起動する前にスクリプトが実行されます。
または、(空の)ファイルを作成して通知できます。[email protected]
いいえ始めます。これの利点は、getty
1-6だけでなく、すべてのインスタンスに条件を自動的に追加することです。
これを行うには、サービスが開始される前にファイルを作成します。
[Unit]
Description=Run script to set up environment
[Service]
Type=oneshot
ExecStartPre=/bin/touch /etc/no-login-console
ExecStart=/bin/myscript
ExecStopPost=/bin/rm /etc/no-login-console
次に実行します。これによりエディタが開き、デフォルトのサービスファイルに効果的に追加される「オーバーレイ」ファイルが作成されます。これにより、サービスをカスタマイズできますが、最新バージョンのCentOSサービスファイルを引き続き使用できます。開くエディタで、次のように入力します。systemctl edit [email protected]
[Unit]
ConditionPathExists=!/etc/no-login-console
これは、サービスが/etc/no-login-console
存在しない場合にのみ開始するように指示します。エディタを保存して終了します。実行すると、デフォルトのサービスファイルとオーバーライドが表示されます。systemctl cat [email protected]
編集:CentOS 7.1に付属のバージョンのように見えますが、systemctl edit
使用できません。代わりに(サービスファイルのパスはどこにありますか?)を実行し、上記のテキストをファイルに追加します。その後、実行して実行すると、挿入されたファイルが読み込まれたことを出力に表示する必要があります。systemctl cat
systemd
sudo vim /lib/systemd/system/[email protected]/condition-path.conf
/lib/systemd/system/[email protected]
systemctl daemon-reload
systemctl status getty@
答え2
display-manager
Ubuntu 16.04ではサービスです。たとえば、
[Unit]
Description=Purge home
Before=display-manager.service
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/clean-home.sh
[Install]
WantedBy=display-manager.service