再起動後にスクリプトファイルを実行し、サービス後に起動するサービススクリプトを作成しました[email protected]
。問題は、私のスクリプトファイルはいくつかのユーザー入力を提供する必要がありますが、サービスファイルがシリアルコンソール(MINICOM)に出力を表示しないことです。
minicomウィンドウでスクリプトファイルを実行するサービスファイルの出力を取得する方法があるかどうか疑問に思います。コマンドの実行時に表示される出力を表示できるため、サービスファイルが実行中です。
systemctl status transfer.service
参考のために以下のサービスファイルを添付しました。
[Unit]
Description=My Script Service
[email protected]
[Service]
ExecStart=/home/PARTITION/flag.sh
[Install]
WantedBy=multi-user.target
答え1
通常[email protected]
一つサービステンプレート。テンプレートで定義された実際のサービスは次のとおりです[email protected]
。つまり、シンボルの後の部分は、 @
サービスが適用されるシリアルポートを識別します。
これがなければ、サービスは意味がありません。サービスを開始しようとするとエラーが発生するだけです。
# systemctl start [email protected]
Failed to start [email protected]: Unit name [email protected] is missing the instance name.
See system logs and 'systemctl status [email protected]' for details.
[email protected]
この場合、それがどの用途に使用されるのかわかりません。
通常、あなたのようなシステムサービスはtransfer.service
コンソールから入力を受け取らない。
シリアルポートを特定のサービス専用に指定し、シリアルポートを介して入出力を実行することはできますが、これはシリアルポートが他のサービスで同時に使用されない場合にのみ機能します。特にそのようなシリアルポートシステムコンソールとして使用しないでください。または何かを通してserial-getty@<port name>.service
。
だから私はあなたの設定について少し混乱しています。あなたのMINICOMディスプレイは現在login:
シリアルポートにプロンプトを表示していますか?それでは、これを続けるべきですか?答えが「はい」の場合、そのシリアルポートを使用して入出力を処理することはできません。transfer.service
これは、サービスに入る入力とコンソールプロンプトに入る入力を制御できないためです。入力は最初に読み取ったプロセスに移行し、これは本質的に予測できません。
シリアルポートが現在使用されていない場合(つまり、MINICOMウィンドウでEnterキーを数回押しても出力が表示されない場合)、以下を追加してサービスを接続できます。
StandardInput=tty
StandardOutput=tty
TTYPath=/dev/ttyS0 # or whatever is the actual device name for the serial port
[Service]
ファイルセクションtransfer.service
。これにより、シリアルポートが利用可能になるとすぐにスクリプトが起動し、シリアルポートにアクセスできる人は誰でもログインせずにスクリプトとやり取りできます。
ログイン時にスクリプトを対話的に実行するには、次の/home/PARTITION/flag.sh
2つの標準的な方法があります。
これをログインスクリプト(通常は
~/.bash_profile
または~/.profile
)に追加できます。あるいは、特定のユーザーアカウントをスクリプト実行専用として指定し、他の操作を実行したくない場合は、スクリプトを次のように設定できます。はいそのユーザーのデフォルトシェルを使用
sudo chsh -s /home/PARTITION/flag.sh username
すると、そのユーザーがログインするとすぐにスクリプトが起動し、終了するとすぐにログアウトしてログインプロンプトに戻ります。