最新記事

systemd を使用して再起動すると、Celery Worker は早期に終了します。
systemd
systemd-unit

systemd を使用して再起動すると、Celery Worker は早期に終了します。

私はsystemdでセロリを使います。私は再起動すると、ほとんどの場合、作業中にワーカーを失うことがわかりました。 celery multiドキュメントによれば、celery multi stopwaitはタスクが完了するのを待たなければならないようです。 再起動すると、次のエラーが発生します。 Process "ForkPoolWorker-10" pid:16902 exited with "signal 15 (SIGTERM)" celery.conf [Unit] Description=Celery background worker After=network.target [Service] Type=forking User=celery Group=celery WorkingDirectory=/src ExecStart=celery multi start worker -A main.celery -Q celery --logfile=/data/celery.log --loglevel=info --concurrency=10 --pidfile=/var/run/celery/%%n.pid ExecStop=celery multi stopwait worker --pidfile=/var/run/celery/%%n.pid [Install] WantedBy=multi-user.target また、SIGTERMを送信する前に作業が完了するまで少なくとも90秒待つ必要があるというsystemd文書も読みました。再起動コマンドを実行した後、10秒以内にこのエラーが発生します。 私は何が間違っていましたか? セロリバージョンの使用:5.2.2(dawn-chorus)

Admin

sssdでグループを起動するとdockerソケットが失敗する
systemd
docker

sssdでグループを起動するとdockerソケットが失敗する

分離モードでdockerを実行しており、daemon.jsonには次のものがあります. "group": "devgp", "userns-remap": "default", 「devgp」は、sssdを介してLDAPで定義されているグループです。これは、ネットワークが動作してsssdが実行されるまで、システムが起動時にそれを認識しないことを意味します。 Dockerは起動時に起動しませんが、その後は手動で正常に起動します。私たちが見つけたシステムログから Nov 29 18:30:18 dotter systemd: Failed to chown socket at step GROUP: No such process Nov 29 18:30:18 dotter systemd: docker.socket control process exited, code=exited status=216 Nov 29 18:30:18 dotter systemd: Failed to listen on Docker Socket for the API. Nov 29 18:30:18 dotter systemd: Dependency failed for Docker Application Container Engine. Nov 29 18:30:18 dotter systemd: Job docker.service/start failed with result 'dependency'. Nov 29 18:30:18 dotter systemd: Unit docker.socket entered failed state. さて、それはドッカーの操作をネットワークとSSDに依存させるようにする必要があります。だから私が作った/etc/systemd/system/docker.socket.d/override.confそして: [Unit] After=network-online.target firewalld.service containerd.service sssd.service Wants=network-online.target sssd.service [Socket] SocketGroup=qtim そして創造する/etc/systemd/system/docker.service.d/override.confそして: [Unit] After=sssd.service しかし、まだ動作しません。システムログに次のメッセージがあります。 Nov 30 08:02:37 dotter systemd: Found ordering cycle on sockets.target/start Nov 30 08:02:37 dotter systemd: Found dependency on docker.socket/start Nov 30 08:02:37 dotter systemd: Found dependency on firewalld.service/start Nov 30 08:02:37 dotter systemd: Found dependency on basic.target/start Nov 30 08:02:37 dotter systemd: Found dependency on sockets.target/start Nov 30 08:02:37 dotter systemd: Breaking ordering cycle by deleting job docker.socket/start Nov 30 08:02:37 dotter systemd: Job docker.socket/start deleted to break ordering cycle starting with sockets.target/start だからDockerを起動しようとしないでください。 ネットワークとsssdが起動した後にのみsystemdにDockerソケットとサービスを起動させる魔法を知っていますか?

Admin

systemd-nspawn コンテナ内で実行すると、「接続タイムアウト」により hostnamectl が失敗します。
systemd
hostname
namespace
systemd-nspawn

systemd-nspawn コンテナ内で実行すると、「接続タイムアウト」により hostnamectl が失敗します。

私はRaspberry Pi OSイメージを使用してsystemd-nspawn起動qemu-arm-staticし、ストックイメージをSDカードにフラッシュする前にカスタマイズを適用しています。 ホストはUbuntu 20.10(システムバージョン:246.6-1ubuntu1)です。 ゲストオペレーティングシステムはRaspberry Pi OSです(2020年8月、Debian Busterベース、システムバージョン:241)。 これは完璧に動作します。を使用してパッケージをインストールしたりapt-get、を使用してサービスを有効にするsystemctlなどの作業を行うことができます。 1つの例外があります。hostnamectlこれは、最新のLinuxディストリビューションでホスト名を設定するための好ましい方法です。 # hostnamectl Failed to query system properties: Connection timed out システムログに次の出力が表示されます。 Oct 26 20:08:05 raspberrypi dbus-daemon[219]: [system] Activating via systemd: service name='org.freedesktop.hostname1' unit='dbus-org.freedesktop.hostname1.service' requested by ':1.23' (uid=0 pid=2300 comm="/usr/bin/qemu-arm-static /usr/bin/hostnamectl " label="unconfined") Oct 26 20:08:05 raspberrypi systemd[1]: Starting Hostname Service... Oct 26 20:08:05 raspberrypi systemd[2303]: systemd-hostnamed.service: Failed to set up network namespacing: Input/output error Oct 26 20:08:05 raspberrypi systemd[2303]: systemd-hostnamed.service: Failed at step NETWORK spawning /lib/systemd/systemd-hostnamed: Input/output error Oct 26 20:08:05 raspberrypi systemd[1]: systemd-hostnamed.service: Main process exited, code=exited, status=225/NETWORK Oct 26 20:08:05 raspberrypi systemd[1]: systemd-hostnamed.service: Failed with result 'exit-code'. Oct 26 20:08:05 raspberrypi systemd[1]: Failed to start Hostname Service. Oct 26 20:08:30 raspberrypi dbus-daemon[219]: [system] Failed to activate service 'org.freedesktop.hostname1': timed out (service_start_timeout=25000ms) 次のコマンドを使用してイメージを起動します。 systemd-nspawn -b -i /dev/loop3p2 ホスト名の設定の回避策として、次の古典的な方法を使用します。 # echo my-pi > /etc/hostname # echo "127.0.1.1 my-pi" >> /etc/hosts hostnamectlこれはうまく機能しますが、メソッドが実行時に機能しない理由systemd-nspawnと、これが予想される動作であるかどうかを理解したいと思います。

Admin

継続的に実行されているアプリケーションのシステムサービスを作成する方法(時間枠内のみ)
ubuntu
systemd
systemd-timer

継続的に実行されているアプリケーションのシステムサービスを作成する方法(時間枠内のみ)

デフォルトでは、カメラストリームを継続的に分析し、いくつかの情報をサーバーに送信するソフトウェアがあります。これはヘッドレスシステム(Ubuntu 16.04)です。申請書は毎日午前7時30分に始まり、午後10時に終了する必要があります(日曜日を除く)。アプリケーションはその期間内にいつでも実行する必要があるため、クラッシュや停電が発生した場合は再起動する必要があります(ソフトウェアをホストするコンピュータは停電後に電源が入るように設定されています)。時間ウィンドウ。現在私はこのcronjobを使用しています。 * 7-21 * * 1-6 check-software.sh 00 22 * * 1-6 killall mysoftware check-software.shは次のとおりです。 #!/bin/bash check_process() { if ps aux | grep "[m]ysoftware" then return 1 else return 0 fi } check_process if (test $? -eq 0) then echo mysoftware not running ./mysoftware else echo mysoftware running fi うまくいきますが、cronの代わりにsystemdサービスを使用したいと思います。そのため、タイマーのあるサービスをこのように使用しようとしています。 myservice.service存在する.config/systemd/user [Unit] Description=My Software StartLimitInterval=0 [Service] Type=simple Restart=always RestartSec=10 WorkingDirectory=/opt/mysoftware ExecStart=/opt/mysoftware/mysoftware ExecStartPost=/home/myuser/clear_timer.sh mytimer.timer存在する.config/systemd/user [Unit] Description=Run my software [Timer] OnCalendar=Mon-Sat 07:29:00 Persistent=true [Install] WantedBy=timers.target clear_timer.shこれは: #!/bin/bash rm ~/.local/share/systemd/timers/* export XDG_RUNTIME_DIR=/run/user/1000 systemctl --user restart mytimer.timer 私が見るには、Clear_timerがタイマーの最後の実行を取り除き、電源が切れたときに7:30が経過すると、タイマーが以前に実行されたことがないことに気づいて実行するようにして、この問題を解決する必要があるようです。しかし、これはうまくいきません! 7時30分以降に停電が発生した場合、ソフトウェアは起動しません。それ以外の場合、この方法は期待どおりに機能します(ただし、午後10時にソフトウェアを停止するには常にcronjobが必要です)。どんなアイデアがありますか?

Admin

systemd
logs
logrotate

"file:" 構成で systemd が管理するサービスログを正しく記録する方法

systemdにログを直接ファイルに書き込むように指示するsystemd構成を持つsystemdが管理するサービスがあります(syslogやその他の項目はありません)。 StandardOutput=file:/var/log/foo/my.log ログ回転ルールがあります /var/log/foo/*.log { rotate 31 daily missingok notifempty compress delaycompress sharedscripts } 何が起こっているのかは、ログは循環していますが、サービスはまだ以前に循環したファイルに書き込んでいますが、新しいログファイルはまだ空です。 サービスがsyslogに記録する同様のタスク設定があります。 logrotate設定 postrotate invoke-rc.d rsyslog rotate > /dev/null 、ログが交換されたことをsyslogに通知します。 問題は、問題がある場合はログがファイルに直接送信されるため、同様のシグナルをsystemdに送信するのか、実際のサービスプロセスに送信するのかを知ることができないことです。 私はcopytruncatelogrotateでこのオプションを見つけて、それが私の問題を解決すると確信していますが、これは理想的なcopytruncateアプローチではありません。 この問題をどのように解決できますか? systemdに信号を送る必要がありますか?サービスプロセスに信号を送る必要がありますか?copytruncatelogrotateで使用する必要がありますか? 重要な場合、サービスはログバックを使用してstdoutに書き込むJavaプロセスです。

Admin

systemdテンプレートファイルのPolkitルール - 方法
systemd
polkit

systemdテンプレートファイルのPolkitルール - 方法

特定のユーザーが特定のサービスを開始/停止/再開できるようにするためにpolkitを使用しようとしています。これらのサービスはsystemdテンプレートによって定義されているため、たとえば、ユーザーは次のコマンドを実行できます systmctl stop my-daemon@.service。パラメータはカスタム英数字文字列です。このpolkitルールは完全に機能します。 polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.systemd1.manage-units" && action.lookup("unit") == "[email protected]" && subject.user == "user1") { return polkit.Result.YES; } しかし、これは変化のない範囲、金持ち1そして他のパラメータと一緒には機能しません。 ルールを一般化するために正規表現を使ってみました。以下は、ルールの主な3行目の例です。 action.lookup("unit") == "my-daemon@*" && action.lookup("unit") == "my-daemon@[:alnum:]+" && action.lookup("unit") == "my-daemon@foo[0-9]" && 上記のいずれも機能しません。私の考えでは、ポルケットはそうです。いいえここでは正規表現が許可されます。私が読んでsystemd テンプレート単位ファイルの Polkit ルールしかし、これは私にとって解決策ではありません。作成者は、ユニット名ではなくファイル名を直接テストしています。私は何が間違っていましたか? これは前の質問につながります。ユーザーとしてsystemdシステムサービスを制御するしかし、以前のsystemdを使用する前に静的ルールを書くことはできませんでした。これでうまくいくはずですが、悲惨に失敗しています。 OS Suse 12.5 Polkit version 0.113 Systemd version 228

Admin

Docker SystemDには、まず別のコンテナが必要です。
systemd
boot
docker

Docker SystemDには、まず別のコンテナが必要です。

systemdを介してすべてのDockerコンテナを制御します。すべてがうまくいきましたが、再起動後に他のコンテナがまだ起動していないため、私のコンテナの1つが機能しないことがわかりました。 コンテナAが起動するまでドッカーコンテナBが起動しないようにするための最良かつ正しい方法は何ですか?

Admin

systemctl.service ファイルの execstart で $HOME 環境変数の使用を許可する
systemd
systemctl

systemctl.service ファイルの execstart で $HOME 環境変数の使用を許可する

私はこのようなことをしたい: [Unit] Description=ROT13 demo service After=network.target StartLimitIntervalSec=1 [Service] Type=simple User=oleg ExecStart=$HOME/.local/bin/cprev-agent # user the home env var [Install] WantedBy=multi-user.target 私のように$ HOME環境変数を使用する方法はありますか、それともハードコードする必要がありますか?

Admin

システムデバイスがどれくらいの期間実行されていますか?
systemd
journalctl

システムデバイスがどれくらいの期間実行されていますか?

ブーツの後ろに自分のコンピュータを一覧表示できますjournalctl --list-boots。出力は次のとおりです。 -4 21b1318cbaf04732b95ed0a5e40f6698 Tue 2019-06-25 17:26:53 CEST—Fri 2019-07-05 17:11:31 CEST -3 02d30049fdef4a809122f499ef95d122 Fri 2019-07-05 17:12:33 CEST—Wed 2019-08-14 10:23:47 CEST -2 aedc9088bd0a4a9588c387e593c9cc25 Wed 2019-08-14 10:24:41 CEST—Fri 2019-09-20 16:28:12 CEST -1 e40c23b16b86400292b7da77f03f677f Fri 2019-09-20 16:29:03 CEST—Mon 2019-10-07 16:31:20 CEST 0 973dc1142add4a249e784c1a68fac31a Mon 2019-10-07 16:32:11 CEST—Tue 2019-10-15 12:12:22 CEST そのため、コンピュータがいつ起動し、いつ終了するかを調べるために使用できます。 単一のシステムユニット(私の場合は.service)に同じ情報が必要です。しかし、私はこの情報を取得する方法を見つけることができませんでした。明らかなjournalctl -u foo.service戻り行は次のとおりです。 Oct 10 00:00:01 localhost systemd[1]: Started foo service. Oct 10 00:00:02 localhost foo[19382]: some foo output Oct 10 00:00:02 localhost foo[19382]: some foo output Oct 10 00:00:02 localhost foo[19382]: some foo output Oct 10 00:00:02 localhost foo[19382]: some foo output Oct 10 00:00:02 localhost foo[19382]: some foo output Oct 10 00:00:02 localhost foo[19382]: some foo output Oct 10 00:11:22 localhost foo[19382]: some foo output Oct 10 12:00:01 localhost systemd[1]: Started foo service. ... これにより、サービスが00:00:01に開始され、12:00:01に再起動されたことがわかりますが、正確にどのくらいの期間実行されたかはわかりません(少なくとも00:11:22まで実行されたというだけです)。 。 背景:過去にサービス(私の場合はバックアップスクリプト)に時間がかかったかどうかを知りたいです。

Admin

システム化されたサービスが必要またはオプションの場合
systemd

システム化されたサービスが必要またはオプションの場合

一部のクライアントアプリケーションでは、本番環境でStrongswan VPNを使用しています。再起動後、Strongswanはロードされません(network-online.service以降は少し時間がかかります)。 [Unit]セクションに加えて、VPNが必要な残りのサービスを「遅延」することができました。 [Unit] Wants=strongswan.service After=network-online.service strongswan.service VPN以外の環境で同じサービスが実行されているため、この操作は失敗します。 Wants / Afterを使用する「オプションの」方法はありますか?

Admin

systemdサービス:EnvironmentFileディレクティブはどのユーザーに読み込まれますか?
systemd
environment-variables

systemdサービス:EnvironmentFileディレクティブはどのユーザーに読み込まれますか?

次のように構成されたsystemdサービスがあります。 [Unit] Description=example systemd service unit file. [Service] ExecStart=/path/to/program EnvironmentFile=/etc/program.conf User=someuser [Install] WantedBy=multi-user.target 今問題は、EnvironmentFileどのユーザーが読んでいるかということです。行動するのかroot、行動するのかsomeuser?文書はあまり明確ではありませんが、テキストは次のとおりです。 このディレクティブでリストされたファイルは、プロセスが実行される直前に読み取られます(具体的には、前のデバイス状態のすべてのプロセスが終了した後)。これは、1つのデバイス状態でこれらのファイルを生成し、このオプションを使用して、次のデバイス状態でファイルシステムの変更(バインドマウントなど)が発生する前に、サービスマネージャのファイルシステムから読み取ることができることを意味します。 したがって、バインドマウントをで行う必要があるかもしれません。これは、バインドマウントの前にroot環境ファイルを読み取るので、環境ファイルをに読み込むと仮定できることを意味しますか?root 試してみることができますが、それについての文書がより明確ではないという事実に少し驚きました。たぶん私が間違った場所を探しているのかもしれません。

Admin