rikuya-h
2025年1月27日 14時00分
お世話になっております。
長谷部と申します。
現在Armadillo-IoT G4を用いて
ある機器からsyslogデータを受信してデータ加工をpythonで行いたく考えております。
コンテナへapt-get installで rsyslog と systemctl をインストールし手動で立ち上げ、動作確認まで出来ましたが...
コンテナ起動時におけるrsyslogサーバーの"自動起動"が上手くいきません。
どの様に設定すれば良いでしょうか?
コメント
rikuya-h
at_dominique.m…
rikuya-h
at_dominique.m…
長谷部さん、
マルティネです。
> 因みにですが、python_launchへバッググラウンド実行されないコマンドの末尾に & を追加してバックグラウンド実行させようとして
> 記述しコンテナ起動させるとエラーが起きるのですが
> 対処法はありますでしょうか?
こちらについては心当たりありません。
python_launch は普通のシェルスクリプトですので & も利用可能です。
何かの誤記(日本語の空白など)の可能性もありますので確かめてみてください。
解決できなかった場合はスクリプトとエラーメッセージを添付等で提供いただければみれます。
よろしくお願いします。
rikuya-h
事象回復しないためご教授頂けると助かります。
> 何かの誤記(日本語の空白など)の可能性もありますので確かめてみてください。
> 解決できなかった場合はスクリプトとエラーメッセージを添付等で提供いただければみれます。
python_launchファイルへ以下を追記
python3 /vol_app/src/main.py &
echo 'test'
コンテナを再起動すると...
armadillo:/var/app/rollback/volumes/python/src# podman exec -it app bash
Error: can only create exec sessions on running containers: container state improper
podman ps -a
1f4499079c22 localhost/python:latest python_launch 3 hours ago Exited (0) About a minute ago 0.0.0.0:3000->3000/tcp,,(省略) app
の様な状態となりコンテナが停止してしまいます。
at_satoshi.ohta
横から失礼いたします、太田です。
1点確認させてください。
> python_launchファイルへ以下を追記
こちらArmadillo上でpodman execコマンドを用いてコンテナに入ってpython_launchファイルを修正したということでしょうか?
もしそうであれば、上記の方法ではなく、
ATDE上にあるpython_launchファイルを修正していただけますでしょうか?
python_launchはデフォルトではコンテナイメージに含まれているため、&を反映させるためにはコンテナイメージ自体を更新する必要があると思われます。
ATDE上のpython_launchファイルは、最新のpythonプロジェクトでは以下のパスにあるはずです。
<作成したpythonのプロジェクトディレクトリ>/containers/resources_python/bin/python_launch
このファイルを修正したのち、[Generate development swu]もしくは[Generate release swu]を実行して、
生成されたSWUイメージ(development.swuまたはrelease.swu)をArmadilloにインストールしてください。
その後、コンテナの挙動をもう一度確かめてみていただいてもよろしいでしょうか?
よろしくお願いいたします。
at_shinya.koga
アットマークテクノの古賀です。
以下の振る舞いは、podman の仕様と、コンテナ動作の仕様の組み合わせによるものです。
長谷部さん:
>事象回復しないためご教授頂けると助かります。
>>何かの誤記(日本語の空白など)の可能性もありますので確かめてみてください。
>>解決できなかった場合はスクリプトとエラーメッセージを添付等で提供いただければみれます。
>
>python_launchファイルへ以下を追記
python3 /vol_app/src/main.py & echo 'test'
>
>コンテナを再起動すると...
armadillo:/var/app/rollback/volumes/python/src# podman exec -it app bash Error: can only create exec sessions on running containers: container state improper
>podman ps -a
1f4499079c22 localhost/python:latest python_launch 3 hours ago Exited (0) About a minute ago 0.0.0.0:3000->3000/tcp,,(省略) app
>の様な状態となりコンテナが停止してしまいます。
以下、この振る舞いについての説明です。
まず、podman の exec サブコマンドは、Docker の場合と違い、終了状態(Exited)のコンテナに対して実行できません。
https://docs.podman.io/en/v1.6.4/markdown/podman-exec.1.html
https://github.com/containers/podman/issues/3020
つまり、python_launch に記載したコマンド列を実行対象としてコンテナを起動した後、podman exec を実行した時に以下のエラーとなるのは、その時点でコンテナが実行終了しているからなのです:
Error: can only create exec sessions on running containers: container state improper
記載いただいた python_launch では、main.py を実行する python3 コマンドをバックグラウンド実行開始した後、echo コマンドを実行しますが、echo コマンドが実行終了するとコンテナが動作終了するのです。
冒頭で述べたように、これはコンテナ動作の仕様です。
コンテナエンジンがコンテナを実行する際、実行コマンドとして指定されたプログラムの実行が終了すると、そのプログラムから起動されたバックグラウンドプロセスが動作中であっても、コンテナは動作終了します。
たとえば、stackoverflow に寄せられた "Docker exit after starting a command which goes into background. Then how can we take benifit of that service" という質問に対するコメントを見てみてください:
https://stackoverflow.com/a/54991182
記載頂いたエラーを回避するには、このコメントで述べられているように、フォアグラウンドで実行するコマンドが、バックグラウンド実行するプログラムが終了する前に終了してしまわないようにしないといけません。
たとえば、 sleep infinity ですとか、上の stackoverflow のコメントにある tail -f /dev/null など、実行終了しないコマンドを末尾に記載するのがお手軽でしょう。
あるいは、バックグランド実行するプログラムが一つだけであれば、コメントで紹介されている Docker のドキュメントの例のように、wait -n で実行終了を待つ、というやり方もあるでしょう:
https://docs.docker.com/engine/containers/multi-service_container/#use-…
# ちなみに、このドキュメントの例では、二つのプログラムをバックグランド実行していますので、どちらか一方が終了するとコンテナが実行終了します。
以上、参考になりましたら幸いです。
rikuya-h
ご回答ありがとうございます。
> 記載いただいた python_launch では、main.py を実行する python3 コマンドをバックグラウンド実行開始した後、echo コマンドを実行しますが、echo コマンドが実行終了するとコンテナが動作終了するのです。
> 冒頭で述べたように、これはコンテナ動作の仕様です。
>
> コンテナエンジンがコンテナを実行する際、実行コマンドとして指定されたプログラムの実行が終了すると、そのプログラムから起動されたバックグラウンドプロセスが動作中であっても、コンテナは動作終了します。
こちら失念しておりました。
丁寧な回答ありがとうございました。
頂いた内容で開発を進めさせて頂きます。
at_dominique.m…
2025年1月27日 14時42分
長谷部さん
お世話になっています、
マルティネです。
> ある機器からsyslogデータを受信してデータ加工をpythonで行いたく考えております。
> コンテナへapt-get installで rsyslog と systemctl をインストールし手動で立ち上げ、動作確認まで出来ましたが...
コンテナの実行コマンドを systemd にすることで、systemctl 等でコンテナ内にサービスを制御することは可能ですが、一般的なコンテナでは systemd を利用することは少ないのでおそらく systemd を起動してないことで rsyslog も起動していないかと思います。
本当に systemd で rsyslog を起動したい場合は、コンテナのコンフィグファイルの「
set_command
」を現状のコマンドから/lib/systemd/systemd
へ変更すると systemd が立ち上がって systemctl で制御できるようになるかと思います。また、他の方法としては:
* systemd を利用しなくてもコンテナの起動スクリプトで rsyslog を手動に起動すれば起動はできます。
* syslog の受信はシンプルな udp socket でパッケットを受信するだけですので、処理内容によっては python プロセスから socket を立ち上げて直接に bind/recvmsg を実装した方が早いかもしれません。
よろしくお願いします