In einem typischen Szenario werden während des Startvorgangs die Runlevel-Systemstartskripts nacheinander ausgeführt.
Ein bestimmtes Runlevel-Startskript wird nicht ausgeführt, bis das vorherige Skript vollständig ausgeführt wurde. Wenn ein bestimmter Dienst während des Starts aus irgendeinem Grund hängen bleibt, kann es eine Weile dauern, bis das Zeitlimit überschritten wird und mit dem nächsten Startskript fortgefahren wird.
Das Dienstprogramm Startpar wird verwendet, um mehrere Run-Level-Skripts parallel auszuführen. Dies hilft, den Startvorgang Ihres Servers zu beschleunigen.
Das Startpar-Dienstprogramm ist Teil des sysvinit-Pakets.
Die allgemeine Syntax für startpar ist unten angegeben:
startpar –p par –i iorate –t timeout –T global timeout –a arg prg1 prg2 startpar –p par –I iorate –t timeout –T global timeout –M boot|start|stop
Das Folgende sind die verschiedenen Optionen von startpar:
- -p Nummer des parallel laufenden Prozesses.
- -i Ändern Sie den Gewichtungsfaktor des Prozessblocks. Der Standardwert ist 800.
- -t Timeout zum Leeren des Puffers eines Skripts, wenn keine Ausgabe erfolgt ist.
- -T Globales Zeitlimit. Es wird verwendet, um die Pufferausgabe vorheriger Skripte zu leeren .
- -a Argumente, die allen Skripten zur Verfügung gestellt werden sollen.
- -M Schaltet startpar in den „make“-Modus.
- -P Vorherigen Runlevel angeben
- -N Nächstes Runlevel angeben
Wenn startpar die Run-Level-Skripte ausführt, wird die Ausgabe der Skripte gepuffert, um ein kontrolliertes Schreiben in Protokollierungseinrichtungen zu ermöglichen.
Wenn andere Skripte parallel laufen, wartet es auf den Abschluss des Loggings und schreibt dann die Daten vom Buffer in den Logging-Bereich. Die Optionen –t und –T werden verwendet, um das Löschen dieser Puffer abhängig von der Zeit seit der letzten Ausgabe zu steuern, die im Puffer erfasst wurde.
Auf meinem System habe ich folgende Version von startpar:
# startpar -v startpar version 0.54
Der Startpar-Befehl kann in einem „Make“-Modus mit der Option –M verwendet werden. In diesem Modus verwendet startpar die folgenden Dateien, um zu entscheiden, wie die Startskripte ausgeführt werden sollen.
/etc/init.d/.depend.start
/etc/init.d/.depend.stop
Hier ist ein Beispiel für eine .depend.start-Datei:
# cat /etc/init.d/.depend.start TARGETS = halt fbset lvm_wait_merge_snapshot microcode.ctl earlysyslog dbus acpid random purge-kernels reboot network haldaemon boot.clock syslog ford_tso_off Sts splash_early haveged rpcbind multipathd nfs smbfs kbd irq_balancer alsasound mcelog network-remotefs sshd java.binfmt_misc clamd logd gpm ntp single atd clamav-milter canna amavis cups nscd postfix xdm cron smartd INTERACTIVE = kbd ntp single network: dbus haldaemon: dbus acpid syslog: network earlysyslog ford_tso_off: network Sts: network splash_early: syslog haveged: syslog random rpcbind: syslog multipathd: syslog nfs: rpcbind . . . . mcelog: smbfs network-remotefs: smbfs haldaemon
Im „make“-Modus verwendet startpar die Datei .depend.start, um herauszufinden, welche abhängigen Dienste gestartet werden müssen, um einen bestimmten Dienst zu starten.
Wenn in der obigen Ausgabe startpar im Startmodus mit der Option make ausgeführt wird, werden die abhängigen Skripte zuerst gestartet, bevor die Skripte parallel ausgeführt werden.
Hier ist ein Beispiel, wie das Startpar im Make-Modus während der Systemstartsequenz verwendet werden kann,
# startpar -p 4 -t 20 -T 3 -M start -P N -R 2 D-Bus already started. Not starting. Starting acpid done Re-Starting syslog services done Starting service at daemon done Starting sound driver done Starting cupsd done Starting CRON daemon/usr/sbin/cron: can't lock /var/run/cron.pid, otherpid may be 3506: Resource temporarily unavailable startproc: exit status of parent of /usr/sbin/cron: 1 done Starting irqbalance unused HAL already started. Not starting. Starting mcelog... already running done Setting up network interfaces: eth0 device: Intel Corporation 82545EM Gigabit Ethernet Co eth0 IP address: 19.86.xxx.xxx/24 done eth1 device: Intel Corporation 82545EM Gigabit Ethernet Co eth1 IP address: 19.86.xxx.xxx/24 done Setting up service network . . . . . . . . . . done Hint: you may set mandatory devices in /etc/sysconfig/network/config Setting up (remotefs) network interfaces: Setting up service (remotefs) network . . . . . . . . . . done Initializing random number generator done Starting smartd unused Disabling TSO on all interfaces and adding ETHTOOL_OPTIONS to nic config files done Re-Starting syslog services done Starting haveged daemon done failed_service="alsasound" skipped_service="irq_balancer smartd"
Im obigen Beispiel wird startpar mit der Gesamtzahl von 4 Prozessen ausgeführt, die parallel mit einem Timeout von 20 Sekunden ausgeführt werden, globales Timeout 3 Sekunden, um den Pufferbereich zu leeren, -M im Make-Modus mit „Start“-Option, um den Start anzuzeigen in der Startsequenz verwendet werden.
Dies wird /etc/init.d/.depend verwenden. start-Datei, um die voneinander abhängigen Skripte zu überprüfen. –P ist der vorherige Runlevel –N ist der neue Runlevel.
Hier ist ein weiteres Beispiel für die Verwendung von startpar, nur um 2 Skripte parallel auszuführen. Sie können dieses Skript auch auf /etc/init.d/rc definieren, um sicherzustellen, dass diese Skripte bei Bedarf parallel während des Systemstarts gestartet werden.
# startpar -p 4 -t 20 -T 3 -a start /etc/init.d/ypxfrd /etc/init.d/drbd Starting rpc.ypxfrd done Starting DRBD resources: . .
In einigen Linux-Distributionen können Sie das System auch so einrichten, dass es die Option startpar in der Datei /etc/init.d/rc verwendet.
Ändern Sie in der rc-Datei einfach den Wert „CONCURRENCY=SHELL“ auf „CONCURRENCY=STARTPAR“, wodurch die Abhängigkeiten automatisch berechnet und die entsprechenden Skripte parallel gestartet werden sollten.
# vi /etc/init.d/rc CONCURRENCY=STARTPAR