Dostosuj swoją usługę systemd Asteriska w CentOS

Dostosuj swoją usługę systemd Asteriska w CentOS

W tym artykule omówimy w jaki sposób oraz dlaczego warto stworzyć własny plik asterisk.service dla systemów CentOS 7+. Jeśli posiadasz gotowe rozwiązania, takie jak FreePBX, IssabelPBX, itp… ingerencja w pliki systemowe może zaburzyć działanie systemu. Warto jednak wiedzieć, jak stworzyć własny plik asterisk.service i jakie mogą wynikać z tego korzyści.

Spis treści

1) Korzyści wynikające z własnej usługi w systemd

Przede wszystkim warto zacząć do oficjalnej dokumentacji.

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/chap-managing_services_with_systemd

Znajdziesz w niej szczegóły dotyczące zarządzania usługami z wykorzystaniem systemd za pomocą polecenia systemctl

Poniżej opiszemy kilka podstawowych elementów pliku, które mogą wpłynąć na to w jaki sposób stworzyć plik.

  • Sekcja [Unit]
    • Description – opis usługi
    • Wants – konfiguruje „słabsze” zależności niż Requires. Jeśli któraś z wymienionych jednostek nie uruchomi się pomyślnie, nie ma to wpływu na uruchomienie usługi
    • After – określa kolejność uruchamiania usług (network.service -> mysqld.service); można wpisać w jednej lub kilku linijkach
  • Sekcja [Service]
    • Type – proces rozpoczęty za pomocą ExecStart jest głównym procesem usługi
    • User – użytkownik
    • Group – grupa
    • ExecStart – określa polecenia lub skrypty, które mają zostać wykonane po uruchomieniu urządzenia/usługi
    • ExecReload – określa polecenia lub skrypty, które mają zostać wykonane po przeładowaniu usługi
    • ExecStop – określa polecenia lub skrypty do wykonania po zatrzymaniu usługi
  • Sekcja [Install]
    • WantedBy – lista jednostek „słabo” zależnych od tej usługi

Oczywiście nie jest to wyczerpująca konfiguracja. Powinno to być wystarczające, żebyś zrozumiał sposób działania systemu.

Konfigurując serwery naszych klientów natknęliśmy się na przykład na sytuację, kiedy podczas startu systemu operacyjnego, najpierw załadowała się usługa Asteriska, a kilka sekund później baza danych. Wynikało to z faktu, że po kilku latach, baza danych mocno „spuchła” i zaczęła się nieco wolniej ładować.

Jaki był efekt?

Obie usługi działały, Asterisk nie wyrzucał błędów, ale nie generowały się wpisy w CDR! 😲

Dopiero przeładowanie usługi z "core reload" przywracało pełną funkcjonalność.

Jeśli chcesz sprawdzić, jak wygląda proces uruchamiania usług w Twoim systemie, możesz użyć polecenia "journalctl", które z parametrem "-b" pokaże co się wydarzyło od ostatniego uruchomienia.

				
					journalctl -b
				
			

Zobaczmy więc, jak uniknąć tego problemu.

PODPOWIEDŹ
Zamiast wykonywać ręcznie, krok po kroku, poniższe instrukcje możesz też skorzystać z naszego instalatora.

PLIK INSTALATORA

2) Usunięcie obecnego pliku asterisk w katalogu init.d

Jeśli podczas kompilacji Asteriska wykonałeś polecenie "make config", system mógł utworzyć plik /etc/init.d/asterisk.

Zawiera on plik, który dodaje usługę do autostartu oraz kontroluje polecenia, takie jak "service asterisk start", "service asterisk stop", "service asterisk restart", itp…

Możesz go usunąć (polecenie "rm") lub przenieść (polecenie "mv") w inne miejsce na serwerze. My po prostu go usuniemy.

				
					sudo rm /etc/init.d/asterisk
				
			

Warto pamiętać, że /etc/rc.d/init.d/asterisk to ten sam plik co /etc/init.d/asterisk i w zależności od dystrybucji, może się znajdować w innym miejscu.

3) Stworzenie własnego pliku asterisk.service

Jeśli nie posiadamy pakietu systemd-devel, warto zacząć od jego instalacji.

				
					sudo yum -y install systemd-devel
				
			

W katalogu z plikami źródłowymi, z którego kompilowałeś własnego Asteriska, znajdziesz dodatkowo plik asterisk.service.

Jeśli nie posiadasz wspomnianych plików źródłowych lub zdążyłeś je skasować, możesz je pobrać w oficjalnej strony Asteriska.

				
					cd /usr/src
sudo wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz
sudo tar zxvf asterisk-16-current.tar.gz
sudo rm -rf asterisk-16-current.tar.gz
cd asterisk-*/
				
			

W tym momencie nie posiadamy jeszcze pliku z usługą Asteriska, więc skopiumy go w odpowiednie miejsce.

				
					cd /usr/src/asterisk-*
sudo cp contrib/systemd/asterisk.service /usr/lib/systemd/system/
				
			
 

Plus jest taki, że nie musimy dawać zwiększonych uprawnień (chmod +x), tak jak to trzeba było zrobić w przypadku poprzedniego pliku.

Zgodnie z opisem z początku tego artykułu, warto plik asterisk.service dostosować do swoich potrzeb.

Istotne zmiany mogą dotyczyć:

				
					# Ustawienia uruchomienia uslugi po załadowaniu sieci i np. bazy danych
Wants=network-online.target
After=network-online.target network.target mysqld.target

# Zmienić typ na "simple" zamiast "notify" - nie czekamy na sd_notify(), jeśli zostało skompilowane z Asteriskiem
Type=simple

# Polecenie przeładowania i zatrzymania usługi
ExecReload=/usr/sbin/asterisk -rx 'core reload now'
ExecStop=/usr/sbin/asterisk -rx 'core stop now'
				
			

Następnie dodaj utworzoną usługę do autostartu.

				
					sudo systemctl enable asterisk.service
				
			

W efekcie storzymy link pomiędzy /etc/systemd/system/multi-user.target.wants/asterisk.service, a /usr/lib/systemd/system/asterisk.service.

Przykładowy plik może wyglądać następująco:

				
					[Unit]
Description=Asterisk PBX and telephony daemon.
#After=network.target
#include these if asterisk need to bind to a specific IP (other than 0.0.0.0)
Wants=network-online.target
After=network-online.target network.target mysqld.target

[Service]
Type=simple
Environment=HOME=/var/lib/asterisk
WorkingDirectory=/var/lib/asterisk
ExecStart=/usr/sbin/asterisk -mqf -C /etc/asterisk/asterisk.conf
ExecReload=/usr/sbin/asterisk -rx 'core reload'
ExecStop=/usr/sbin/asterisk -rx 'core stop now'

LimitCORE=infinity
Restart=always
RestartSec=4

# Prevent duplication of logs with color codes to /var/log/messages
StandardOutput=null

PrivateTmp=true

[Install]
WantedBy=multi-user.target
				
			

Dla porównania, domyślny plik we FreePBX wygląda całkiem podobnie.

Mamy nadzieję, że przygotowanie własnego pliku asterisk.service dla systemd, pomoże Ci w rozwiązaniu potencjalnych problemów i usprawni działanie Twojej usługi.

W naszym przypadku, zgodnie z celem tych zmian, usługi zaczęły ładować się w odpowiedniej kolejności.

4) Powiadomienia sd_notify()

Jeśli podczas kompilacji Asteriska nie miałeś zainstalowanego pakietu systemd-devel, to usługa będzie startowała, ale nie będzie widoczny jej status.

W efekcie zobaczymy:

Loaded: loaded (/usr/lib/systemd/system/asterisk.service; enabled; vendor preset: disabled)
Active: activating (start)

Po instalacji systemd-devel, opisanej na początku tego wpisu, możemy ponownie skomplikować Asteriska.

				
					cd /usr/src/asterisk-*
sudo ./configure --libdir=/usr/lib64 --with-pjproject-bundled --with-jansson-bundled
sudo make
sudo make install
				
			

Centrala zacznie wysyłać ast_sd_notify() (co jest nakładką na sd_notify()) i Type=notify będzie się poprawnie wyświetlało:

Active: active (running)

Masz pytania lub potrzebujesz oferty?

Skontaktuj się z naszym doradcą.

Popularne wpisy

Powiązane posty