
コンピュータからフラッシュカードを物理的に取り外さずにユーザーがシャットダウンまたは再起動するのを防ぎます。そのために、私はSystemDサービスRemoveflash.serviceを作成しました。
[Unit]
Description=Prompt user to remove flash card
[Service]
ExecStop=/usr/lib/systemd/flashshutdown.sh
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Requires=rsyslog.service
flashshutdown.shは、次のbashスクリプトです。
#! /bin/bash
#
while [ -e /dev/flash ] ; do
echo "Please remove flash card"
logger "GHB: Please remove flash card"
sleep 5
done
エコーがオフになっても何もしないと予想していましたが、そうではありません。しかし、loggerコマンドが機能したいと思います。 Requires = rsyslog.serviceが存在しない場合、rsyslog.serviceが終了した後にサービスが終了しました。これが起こらないように要件を挿入しましたが、唯一の違いは、Removeflash.serviceの終了が終了順序でより早く行われることです。幸いなことに、systemd自体がユーザーにフラッシュカードを取り外すためのタスクを実行していることを示すメッセージをコンソールに出力するという事実のため、サービスの目的は維持されました。
コンソールにメッセージを送信する正しい方法は何ですか?
答え1
サービス管理(s6、runit、perp、daemontools、nosh サービス管理、または systemd)の下のサービスの標準出力およびエラーはコンソールではありません。これは一種のログライターに接続されたパイプです。
systemdサービスの場合は、変更するにはaとaを使用して.INIファイルでTTYPath=/dev/console
この設定を変更する必要があります。StandardOutput=tty
StandardInput=tty
読む(しかし、あなたはそうではありません)と書く。証人システムが事前に提供されていますdebug-shell.service
。
これは一般的な原則であり、具体的に体系化されたものではありません。デーモンコンテキストには(何よりも)関連があります。いいえ制御端末があり、端末に対して開いているファイル記述子がなく、適切なサービス管理(例えば、すべてのdaemontoolsファミリ)の下にあるもの次から始まった、管理者/サービス管理者がサービスプロセスをフォークしたときにサービスプロセスが開始されます。したがって、コンソールを使用するには、サービスでコンソールを明示的に開く必要があります。
systemdでは、上記のTTYPath
設定により、StandardInput
サービスプログラムが正常に実行される前に、分岐した子プロセスがコンソールを開くことになります。 systemdの内部に隠されているので、実際には見えません。run
noshサービスプログラムでは、run
プログラムはいくつかのnoshツールセットチェーンローダーを明示的に使用して、基本プログラムを実行する前に同じことを行います(emergency-login
この場合):
%cat/etc/service-bundles/services/emergency-login@console/service/run #!/空/ノッシュ #緊急スーパーユーザーログインコンソール 設定値 vc-get-ttyコンソール オープンコントロールtty vc-reset-tty --ハードリセット line-banner 「緊急モードログイン」 緊急ログイン %
logger
皮肉なことに、対応するコマンドやsyslogの依存関係は必要ありません。この対話型プロンプトを作成することは意味がありません。記録する。ただし、原則として、このサービスを無許可の方法で実行する必要があります。そうではない必要何をしてもスーパーユーザー権限。
#!/bin/bash
もう一つの経験則は、必要な場合以外はスクリプトを使用しないことです。はいBashismが使用されます。過去数十年間に、Debian Linux と Ubuntu Linux でシステムのブート/シャットダウンが最も大幅に加速されたことの 1 つは、/bin/sh
Bourne Again シェルから Debian Almquist シェルに切り替えたことです。このような単純なスクリプトを作成するには、POSIX互換で作成し、次のようにします。#!/bin/sh
それでも、Debian / Ubuntuを使用していなくても、Debian / UbuntuはDebian Almquistシェルの恩恵を受けることができます。
さらに、同様のツールを使用してより透明なTTYメッセージを使用することにした場合は、プログラムがterminfoデータベースからエクスポートする正しいエスケープと制御シーケンスを見つけることができるように環境変数をdialog
設定する必要があります。TERM
もう一度証言してくださいdebug-shell.service
。 (上記のrun
プログラムでは比較のためにvc-get-tty
toolset TERM
。)
同様に、あなたは欲しいでしょうスクリプトエラー記録されます。したがって、標準エラーはStandardError=journal
。以下は、同等の機能を説明し、実際に必要とされていないプログラムを削除するためのユーザー権限を示すnoshサービスrun
プログラムです。 systemd .INIファイルでは次のようになりますUser=daemon
。
%cat/etc/service-bundles/services/monitor-fsck-progress/service/run #!/空/ノッシュ #fsckの進行状況を監視するためのローカルソケット ローカルストリームソケットの受信 --systemd-compatibility --backlog 2 --mode 0644 /run/fsck.progress 設定値 setlogin - デーモンプロセス vc-get-ttyコンソール fdmove -c 4 2 オープンコントロールtty FDモバイル2 4 setuidgid - デーモンプロセス 。 /提供する %
この状態で実行されるプログラムは、./service
エラーがロギングサービスに送信されている間、コンソールにフルスクリーンTUIをレンダリングします。これは通常、サービスやその他のプログラムを実行してコンソールと通信するためにサービスマネージャで実行する必要があります。
もちろん、これらのフルスクリーンTUIプログラムはsystemdの「A stop job is running」(コンソールにも記録されています)と競合します。しかし、これがあなたの問題です。 ☺