systemd.bbclass: only restart the service when it is active at systemd_postinst
PATCH v2 1/1 systemd.bbclass: only restart the service when it is active at systemd_postinst
From: Li Zhijian <[email protected]>
If systemd_postinst is installed as a delayed package scriptlet (installed to /etc/rpm-postints/${PN}) which would be executed at the first time of OS startup. And then this script would block when it is trying to call systemctl to restart service.
It seems that it is not a good timing to restart service at run-postinsts. I test serval services which has supported systemd(uuidd/avahi-daemon), all of them will block the startup.
Steps to reproduce:
1) Installed systemd_postinst as a delayed package scriptlet i.e. Append Following lines to meta/recipes-core/busybox/busybox.inc
pkg_postinst_${PN}-syslog () {
if [ "x$D" != "x" ] ; then
exit 1
fi
}
2) build a rootfs
$ bitbake core-image-minimal
3) startup this rootfsOS would block at /etc/rpm-postinsts/busybox-syslog, like follows [ ***] A start job is running ro Run pending postinsts
This patch can fix the block problem, and make the service is consistent with the original status
--- meta/classes/systemd.bbclass | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
meta/classes/systemd.bbclass +2 -0
@@ -32,7 +32,8 @@ fi if type systemctl >/dev/null 2>/dev/null; then systemctl $OPTS ${SYSTEMD_AUTO_ENABLE} ${SYSTEMD_SERVICE} - if [ -z "$D" -a "${SYSTEMD_AUTO_ENABLE}" = "enable" ]; then + if [ -z "$D" ] && systemctl is-active ${SYSTEMD_SERVICE} &>/dev/null; then + # if service is active, restart it systemctl restart ${SYSTEMD_SERVICE} fi fi
Signature · 1 line
1.7.1
ping...
Signature · 2 lines
Best regards. Li Zhijian
|-----Original Message----- |From: [email protected] |[mailto:[email protected]] On Behalf Of |Li Zhijian |Sent: Tuesday, November 05, 2013 6:14 PM |To: Patches and discussions about the oe-core layer |Subject: [OE-core] [PATCH v2] systemd.bbclass: only restart the service |when it is active at systemd_postinst | |From: Li Zhijian <[email protected]> | |If systemd_postinst is installed as a delayed package scriptlet (installed |to /etc/rpm-postints/${PN}) |which would be executed at the first time of OS startup. And then this script |would block when it is |trying to call systemctl to restart service. | |It seems that it is not a good timing to restart service at run-postinsts. |I test serval services which has supported systemd(uuidd/avahi-daemon), |all of them |will block the startup. | |Steps to reproduce: |1) Installed systemd_postinst as a delayed package scriptlet | i.e. Append Following lines to meta/recipes-core/busybox/busybox.inc |pkg_postinst_${PN}-syslog () { | if [ "x$D" != "x" ] ; then | exit 1 | fi |} |2) build a rootfs |$ bitbake core-image-minimal |3) startup this rootfs | |OS would block at /etc/rpm-postinsts/busybox-syslog, like follows |[ ***] A start job is running ro Run pending postinsts | |This patch can fix the block problem, and make the service is consistent |with the original status | |Signed-off-by: Li Zhijian <[email protected]> |--- | meta/classes/systemd.bbclass | 3 ++- | 1 files changed, 2 insertions(+), 1 deletions(-) | |diff --git a/meta/classes/systemd.bbclass b/meta/classes/systemd.bbclass |index 3700b2e..1feac06 100644 |--- a/meta/classes/systemd.bbclass |+++ b/meta/classes/systemd.bbclass |@@ -32,7 +32,8 @@ fi | if type systemctl >/dev/null 2>/dev/null; then | systemctl $OPTS ${SYSTEMD_AUTO_ENABLE} ${SYSTEMD_SERVICE} | - if [ -z "$D" -a "${SYSTEMD_AUTO_ENABLE}" = "enable" ]; then |+ if [ -z "$D" ] && systemctl is-active ${SYSTEMD_SERVICE} |&>/dev/null; then |+ # if service is active, restart it | systemctl restart ${SYSTEMD_SERVICE} | fi | fi |-- |1.7.1 | | | | |_______________________________________________ |Openembedded-core mailing list |[email protected] |http://lists.openembedded.org/mailman/listinfo/openembedded-core
Whoops, this fell out of my inbox. Whilst the is-active check now
means that the service is restarted on upgrades, if the package is being installed it's now not started if AUTO_ENABLE is set to true.
I think the logic should be "$D unset and (auto enable or is-active)"
Ross
Quoted 83 lines · Li Zhijian
ping...
--
Best regards.
Li Zhijian|-----Original Message----- |From: [email protected] |[mailto:[email protected]] On Behalf Of |Li Zhijian |Sent: Tuesday, November 05, 2013 6:14 PM |To: Patches and discussions about the oe-core layer |Subject: [OE-core] [PATCH v2] systemd.bbclass: only restart the service |when it is active at systemd_postinst | |From: Li Zhijian <[email protected]> | |If systemd_postinst is installed as a delayed package scriptlet (installed |to /etc/rpm-postints/${PN}) |which would be executed at the first time of OS startup. And then this script |would block when it is |trying to call systemctl to restart service. | |It seems that it is not a good timing to restart service at run-postinsts. |I test serval services which has supported systemd(uuidd/avahi-daemon), |all of them |will block the startup. | |Steps to reproduce: |1) Installed systemd_postinst as a delayed package scriptlet | i.e. Append Following lines to meta/recipes-core/busybox/busybox.inc |pkg_postinst_${PN}-syslog () { | if [ "x$D" != "x" ] ; then | exit 1 | fi |} |2) build a rootfs |$ bitbake core-image-minimal |3) startup this rootfs | |OS would block at /etc/rpm-postinsts/busybox-syslog, like follows |[ ***] A start job is running ro Run pending postinsts | |This patch can fix the block problem, and make the service is consistent |with the original status | |Signed-off-by: Li Zhijian <[email protected]> |--- | meta/classes/systemd.bbclass | 3 ++- | 1 files changed, 2 insertions(+), 1 deletions(-) | |diff --git a/meta/classes/systemd.bbclass b/meta/classes/systemd.bbclass |index 3700b2e..1feac06 100644 |--- a/meta/classes/systemd.bbclass |+++ b/meta/classes/systemd.bbclass |@@ -32,7 +32,8 @@ fi | if type systemctl >/dev/null 2>/dev/null; then | systemctl $OPTS ${SYSTEMD_AUTO_ENABLE} ${SYSTEMD_SERVICE} | - if [ -z "$D" -a "${SYSTEMD_AUTO_ENABLE}" = "enable" ]; then |+ if [ -z "$D" ] && systemctl is-active ${SYSTEMD_SERVICE} |&>/dev/null; then |+ # if service is active, restart it | systemctl restart ${SYSTEMD_SERVICE} | fi | fi |-- |1.7.1 | | | | |_______________________________________________ |Openembedded-core mailing list |[email protected] |http://lists.openembedded.org/mailman/listinfo/openembedded-core_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.openembedded.org/mailman/listinfo/openembedded-core
Quoted 5 lines · Ross
Whoops, this fell out of my inbox. Whilst the is-active check now
means that the service is restarted on upgrades, if the package is being installed it's now not started ifAUTO_ENABLEis set to true.I think the logic should be "$D unset and (auto enable or is-active)"
Also, before doing systemctl reload, systemd needs to be told to re-load the services with systemctl --system daemon-reload (thanks Koen for pointing this out).
Ross