追加読書

追加読書

コンピュータからフラッシュカードを物理的に取り外さずにユーザーがシャットダウンまたは再起動するのを防ぎます。そのために、私は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=ttyStandardInput=tty読む(しかし、あなたはそうではありません)と書く。証人システムが事前に提供されていますdebug-shell.service

これは一般的な原則であり、具体的に体系化されたものではありません。デーモンコンテキストには(何よりも)関連があります。いいえ制御端末があり、端末に対して開いているファイル記述子がなく、適切なサービス管理(例えば、すべてのdaemontoolsファミリ)の下にあるもの次から始まった、管理者/サービス管理者がサービスプロセスをフォークしたときにサービスプロセスが開始されます。したがって、コンソールを使用するには、サービスでコンソールを明示的に開く必要があります。

systemdでは、上記のTTYPath設定により、StandardInputサービスプログラムが正常に実行される前に、分岐した子プロセスがコンソールを開くことになります。 systemdの内部に隠されているので、実際には見えません。runnoshサービスプログラムでは、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/shBourne Again シェルから Debian Almquist シェルに切り替えたことです。このような単純なスクリプトを作成するには、POSIX互換で作成し、次のようにします。#!/bin/sh それでも、Debian / Ubuntuを使用していなくても、Debian / UbuntuはDebian Almquistシェルの恩恵を受けることができます。

さらに、同様のツールを使用してより透明なTTYメッセージを使用することにした場合は、プログラムがterminfoデータベースからエクスポートする正しいエスケープと制御シーケンスを見つけることができるように環境変数をdialog設定する必要があります。TERMもう一度証言してくださいdebug-shell.service。 (上記のrunプログラムでは比較のためにvc-get-ttytoolset 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」(コンソールにも記録されています)と競合します。しかし、これがあなたの問題です。 ☺

追加読書

おすすめ記事