Arch-Linux ARM=をRaspberry Piで実行しています。
私のプロジェクトの目標は、スキャンされたメッセージをLANのサーバーに転送するバーコードスキャナーをPiに接続することです。
停電などからシステムを強化し、必要なユーザー操作を最小限に抑えるために、特定のユーザーが起動時に自動的にログインし(完了して機能し)、特定のプログラムが起動時に実行されるように設定します(完了して動作しますが、意図したとおりではありません)。
これまでにこれを追加しました
exec mono scannerSoftware.exe 127.0.0.1 1234 randomString
/home/certainUser/.bash_profile
そのため、(bashrcとは対照的に)ルートに切り替えたり切り替えたりしているときでも、一度だけ実行されます。
私が抱えている特定の問題:システムを起動すると、システムは意図したとおりに機能します(特定のユーザーとしてログインし、scannerSoftware.exeを起動します)。しかし、ユーザーを切り替えてヒットしたい場合 Ctrl+C、ログインプロセスを再開し、特定のユーザーを再度ログインして、プログラムを再度実行します=>元の場所に戻ります。
これが発生する理由についての私の推測は、sysが「ログインが完了していないため、もう一度開始することをお勧めします」を検出することです。
スパムでこれを回避できた Ctrl+C ログインのすぐ近くにあるので、実際にそれを中断しました。もちろん、これは良い習慣ではありません。それはまったく実用的ではないと言っても十分です。
私の質問:
ログインが完了した後にプログラムが実行されるようにするにはどうすればよいですか? Ctrl+C外出すると、無限のログインサイクルを開始する代わりに、特定のユーザーとして通常のbashプロンプトが表示されますか?
編集:
グラフィカルインターフェイスなどは使用していません。コマンドライン(ttyのbash)のみを使用しています。完了すると、システムにはディスプレイさえありません。
答えは要件によって異なります。
特定のユーザーがログインした後にのみ開始することも、再起動(サービス)中に開始することもできます。 ?
ログイン時に開始
exec
を使用してプログラムを起動すると、起動に使用されたプロセスが置き換えられます。
&
を追加することにより、プロセスをバックグラウンドで開始できます。これにより、新しいプロセスが作成され、端末に出力が表示されますが、ログインシェルからのプロンプトもあるので、バックグラウンドプロセスがフォアグラウンドシェルに干渉する可能性があります。 stdoutとstderrをファイル(不要な場合は/ dev/nullであっても)にリダイレクトすることでこれを回避し、干渉を回避できます。ログアウトすると、バックグラウンドで実行されたままの場合、ハングアップシグナルが送信されます(ただし、キャッチできます)ので、バックグラウンドで処理されます。端末に接続されていた場合は、デタッチされます(リダイレクトの要求に応じていなければ、出力は破棄されます)。
もう一度ログインすると、実行中のスキャナーがあるかどうかを確認しない限り、新しいスキャナーが開始されます。これは簡単です。
再起動中に開始
この方法の利点は、プロセスを実行するためにログインする必要がないことです。欠点は、常に実行されていることです。
3つの主要なシステム起動メカニズム、init、upstartおよびsystemd、それぞれが異なります。従来、/ etc/rc.localは、マシン固有のシステムプロセスを追加する場所でした。
WilQuが言及しているように、Archはsystemdを使用しており、彼はこれのためのレシピを提供しているので、繰り返しはしません。
アドバイス
プロセスを開始するためのスクリプトを記述します。たとえそれが1行だけであっても、実行するだけではなく、他のことを実行したい可能性があるため、ここで短いスクリプトを記述してください。 (実行中かどうかを確認し、pidを保存し、日付に基づいて別のランダムな文字列を使用しますか?誰が知っていますか...)。
これにより、スクリプトを開発してテストし、手動で実行して、必要に応じて中身を確認できます。
次に、必要な場所にスクリプトを追加できます(手動で、ログインプロファイル、システムの起動)。
起動時にプログラムを起動したいだけの場合、ログインスクリプトは適切な場所ではありません。
代わりに、systemdユニットファイルを作成します(Archはsystemdを使用しているようです)。
/etc/systemd/system/scanner.service
(またはwhatever.service
)を作成します。
[Unit]
Description=(description of your program)
[Service]
ExecStart=/usr/bin/mono /path/to/scannerSoftware.exe 127.0.0.1 1234 randomString
[Install]
WantedBy=multi-user.target
そしてsystemctl daemon-reload
を実行します。
systemctl enable scanner.service
を実行して、起動時に実行するようにします。
systemctl start scanner.service
およびsystemctl stop scanner.service
を使用して手動で開始および停止し、systemctl status scanner.service
を使用してステータスを確認できます。
DEに依存しますが、ほとんどの場合、コマンドを~/.xinitrc
ファイル。
.bash_profile
はbash用です(彼が命名したとおり)。 bashを実行しない場合、.bash_profileのコンテンツは実行されません。
bash Shell
を使用する場合は、~/.bash_profile
を使用してください。
Tenex C Shell
またはSame TCSH
を使用する場合、以下を使用する必要があります:~/.login
C Shell
を使用する場合は、~/.login
を使用してください。
Z Shell
を使用する場合は、$ZDOTDIR/.zlogin
を使用してください。
Korn Shell
を使用する場合は、~/.profile
を使用してください。