Python-Skript zum automatischen Ändern eines Werts in einer SystemD-Service-Datei
Dieses einfache Python-Skript ändert TimeoutStartSec in jeder SystemD-Service-Datei automatisch.
Aufruf wie folgt:
ensure_timeout_start_usage.sh
python ensure_timeout_start.py /etc/systemd/system/mynodejs.serviceVollständiger Quellcode
ensure_timeout_start.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
ensure_timeout_start.py
Diese Arbeit ist der Allgemeinheit unter der Creative-Commons-"CC0 1.0 Universal" (CC0 1.0)-Widmung gewidmet.
Autor: Uli Köhler
SPDX-License-Identifier: CC0-1.0
Stellt sicher, dass systemd-Unit-Dateien in der [Service]-Sektion TimeoutStartSec=600 haben.
- Wenn [Service] fehlt, wird es hinzugefügt.
- Wenn TimeoutStartSec existiert (beliebiger Wert), wird es auf 600 gesetzt.
- Wenn TimeoutStartSec fehlt, wird es an [Service] angehängt.
Verwendung:
python ensure_timeout_start.py my1.service my2.service
python ensure_timeout_start.py /etc/systemd/system/*.service --dry-run
"""
import argparse
import os
import shutil
import sys
from configupdater import ConfigUpdater
def ensure_timeout_start(filepath: str, value: str = "600", dry_run: bool = False, backup_ext: str = ".bak") -> bool:
"""
Gibt True zurück, wenn eine Änderung nötig war (und durchgeführt wurde oder im Dry-Run durchgeführt werden würde), False, wenn bereits konform.
"""
updater = ConfigUpdater()
try:
updater.read(filepath, encoding="utf-8")
except FileNotFoundError:
print(f"ERROR: File not found: {filepath}", file=sys.stderr)
return False
changed = False
# Sicherstellen, dass die [Service]-Sektion existiert
if not updater.has_section("Service"):
updater.add_section("Service")
changed = True
service = updater["Service"]
if service.has_option("TimeoutStartSec"):
current_val = service.get("TimeoutStartSec").value.strip()
if current_val != value:
service["TimeoutStartSec"].value = value
changed = True
else:
service["TimeoutStartSec"] = value
changed = True
if dry_run:
return changed
if changed:
# Vor dem Überschreiben ein Backup erstellen
if backup_ext:
backup_path = filepath + backup_ext
shutil.copy2(filepath, backup_path)
tmp_path = filepath + ".tmp"
with open(tmp_path, "w", encoding="utf-8", newline="") as f:
updater.write(f)
try:
st = os.stat(filepath)
os.chmod(tmp_path, st.st_mode)
try:
os.chown(tmp_path, st.st_uid, st.st_gid) # erfordert möglicherweise root
except PermissionError:
pass
except FileNotFoundError:
pass
os.replace(tmp_path, filepath)
return changed
def main():
parser = argparse.ArgumentParser(
description="Ensure TimeoutStartSec=600 in the [Service] section of one or more systemd unit files."
)
parser.add_argument("unit_files", nargs="+", help="Path(s) to unit file(s)")
parser.add_argument("--dry-run", action="store_true", help="Show whether a change would be made without writing")
parser.add_argument("--no-backup", action="store_true", help="Do not create backup files")
parser.add_argument("--value", default="600", help="Value to set for TimeoutStartSec (default: 600)")
args = parser.parse_args()
backup_ext = "" if args.no_backup else ".bak"
exit_code = 0
for path in args.unit_files:
changed = ensure_timeout_start(path, value=args.value, dry_run=args.dry_run, backup_ext=backup_ext)
if args.dry_run:
print(f"{path}: {'CHANGE NEEDED' if changed else 'NO CHANGE NEEDED'}")
else:
print(f"{path}: {'UPDATED' if changed else 'ALREADY OK'}")
if not os.path.exists(path):
exit_code = 2
sys.exit(exit_code)
if __name__ == "__main__":
main()Wenn dieser Beitrag dir geholfen hat, erwäge, mir einen Kaffee zu spendieren oder per PayPal zu spenden, um die Recherche und Veröffentlichung neuer Beiträge auf TechOverflow zu unterstützen