22 Temmuz 2020 Çarşamba

Systemd İçin Service Dosyası

Giriş
Bu dosya temel olarak [Unit], [Service], [Install] başlıklarından oluşur. Bu dosyanın yolu şöyledir.
/etc/systemd/system/foo.service
Kullanım
Örnek
İsmi xrandr olan bir servis yaratmak isteyelim. İzlenecek adımlar şöyle. İkinci adım olan 
"systemctl enable ..." ile bilgisayar tekrar başlatılınca servis te çalışır.
- Create a /etc/systemd/system/xrandr.service file (you could specify the service name you like) - sudo chmod 664 /etc/systemd/system/xrandr.service
- sudo systemctl enable xrandr.service
- Check if it is working by sudo systemctl start xrandr.service
Örnek
Açıklaması şöyle
To make your service start automatically upon boot, run

systemctl --user enable my_example.service
If you want to start the service immediately, without rebooting, run

systemctl --user start my_example.service
If you want to stop the service, run

systemctl --user stop my_example.service
To check the status of your service, run

systemctl --user status my_example.service
Service Template
Bazı servisler bilgisayar açılırken değil, bir istek gelince çalışmak üzere (instantiated) ayarlanabilir. Buna service template deniliyor. Açıklaması şöyle.
It is possible for systemd services to take a single argument via the "service@argument.service" syntax. Such services are called "instantiated" services, while the unit definition without the argument parameter is called a "template". An example could be a dhcpcd@.service service template which takes a network interface as a parameter to form an instantiated service. Within the service file, this parameter or "instance name" can be accessed with %-specifiers.
Açıklaması şöyle.
Some applications, like ssh have a unit file that ends with @, like ssh.service and ssh@.service
1. [Unit] Başlığı
Description, ConditionPathExists, After alanları olabilir.
After Olarak network.target ve network-online.target Değerleri
Açıklaması şöyle. Servisimiz network başladıktan sonra çalışsın isteyebiliriz.
network.target has very little meaning during start-up.

network-online.target is a target that actively waits until the nework is "up"
Şöyle yaparız
[Unit]
Description=Streamer
After=multi-user.target sound.target network.target

[Service]
ExecStart=/home/pi/run.sh
KillMode=control-group
Restart=on-failure
TimeoutSec=1

[Install]
WantedBy=multi-user.target
Alias=streaming.service
2. [Service] Başlığı - Çalıştırılacak Uygulama Burada Tanımlanır
Type, RemainAfterExit, ExecStart, ExecStartPre, ExecStartPost, ExecStop alanları olabilir. EnvironmentFile ile dosyadan değerler okunabilir

Örnek
Şöyle yaparız. EnvironmentFile  dosyasında PORT değeri okunur. Bu değere ${PORT} ile erişilir.
[Service]
Type=simple
EnvironmentFile=/etc/my-service/my-service-systemd.cfg
ExecStart=/usr/local/bin/my-service -port=-port=${PORT}
ExecStop=/bin/kill -15 $MAINPID

Type=simple Nedir
Type alanı oneshot,forking,notify gibi değerler alabilir. 

Açıklaması şöyle
Service management subsystems launch service processes in dæmon context already. Those processes do not need to "dæmonize". ... They already have the environment values, and open file descriptors, appropriate to dæmon context, and the several things done by "dæmonization" in fact thwart some of the conventional things that are regularly done with dæmons (e.g. capturing their standard outputs/errors to a log) by service managers.
Açıklaması şöyle
The currently popular systemd init system does not use a shell at all when starting services, so you can define a .service and start it – the service's parent will be init itself. It also has a feature allowing temporary services to be created on-the-fly using systemd-run, with the same results.
Type = simple
Açıklaması şöyle. systemd process'in start işlemini beklemez
Type=simple (default): systemd considers the service to be started up immediately. The process must not fork. Do not use this type if other services need to be ordered on this service, unless it is socket activated.
Type=forking
Açıklaması şöyle. systemd process'in start işlemini bekler
... for type=forking jobs, indicates the process spawn directly by systemd ...
Örnek
Şöyle yaparız
[Unit]
Description=Vendor's Application 
After=network-online.target

[Service]
ExecStart=/path/to/wrapper start
ExecStop=/path/to/wrapper stop
Type=forking

[Install]
WantedBy=multi-user.target
ExecStart ile başlatılan script'in parent'ı Systemd olur. Bu script'in elle çalıştırılmadığını kontrol etmek için şöyle yaparız
if [[ $PPID -ne 1 ]]
then
  echo "Don't call me directly; instead, call 'systemctl start/stop service-name'"
  exit 1
fi >&2
Örnek - ExecStart Alanı
Servis başlarken bir tane scrip çalıştırabilmeyi sağlar. Şöyle yaparız
[Unit]
After=multi-user.target

[Service]
User=your_user
ExecStart=/home/your_user/scripts/xrandr.sh

[Install]
WantedBy=default.target
Örnek
Şöyle yaparız
[Unit]
Description=[My example task]

[Service]
Type=simple
StandardOutput=journal
ExecStart=/usr/local/bin/mytask

[Install]
WantedBy=default.target
Örnek - ExecStart + WorkingDirectory
WorkingDirectory vermek için şöyle yaparız.
[Unit]
Description=My Smtp Service
After=multi-user.target

[Service]
Type=idle
WorkingDirectory=<my path script dir>
ExecStart=/usr/bin/python smtp.py

[Install]
WantedBy=multi-user.target
Örnek - ExecStop
Şöyle yaparız. Bu servis 1 saat uyuduktan sonra dururken iptables komutunu çalıştırır. Servisimiz başlamadan önce ExecStartPre ile iptables servisinin başlaması sağlanır.
[Unit]
Description=unblock internet 1 hour
[Service]
Type=simple
ExecStartPre=/usr/sbin/iptables ...
ExecStart=/usr/bin/sleep 3600
ExecStop=/usr/bin/iptables ...
3. [Install] Başlığı
WantedBy alanı olabilir.
Örnek
Şöyle yaparız.
[Unit]
Description=Copy user mac_override.link
ConditionPathExists=/boot/mac_override.link
After=local-fs.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/mv /boot/mac_override.link /etc/systemd/network/00-default.link
ExecStartPost=/sbin/reboot

[Install]
WantedBy=multi-user.target
Örnek
tomcat için şöyle yaparız.
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre
Environment=CATALINA_PID=/opt/tomcat9/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat9
Environment=CATALINA_BASE=/opt/tomcat9
Environment='CATALINA_OPTS=-Xms512M -Xmx4096M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'
Environment=JPDA_ADDRESS=1144

ExecStart=/opt/tomcat9/bin/catalina.sh jpda start
ExecStop=/bin/kill -15 $MAINPID

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target
Örnek
Environment vermek için şöyle yaparız.
[Unit]
Description=WSO2EI

After=syslog.target
After=network.target

[Service]
Type=simple
WorkingDirectory=/usr/lib/wso2/wso2ei/6.4.0
User=root
Group=nogroup
Environment=JAVA_HOME=/usr/lib/wso2/wso2ei/6.4.0/jdk/jdk1.8.0_192
Environment=CARBON_HOME=/usr/lib/wso2/wso2ei/6.4.0

StandardOutput=syslog
StandardError=syslog

ExecStart=/usr/lib/wso2/wso2ei/6.4.0/bin/integrator.sh
ExecStop=/usr/lib/wso2/wso2ei/6.4.0/integrator.sh stop

#TimeoutSec=130

[Install]
WantedBy=multi-user.target
Örnek
Sadece sshd ve networkd servisini çalıştırmak için şöyle yaparız.
[Unit]
Description=Maintenance Mode with Networking and SSH
Requires=maintenance.target systemd-networkd.service sshd.service
After=maintenance.target systemd-networkd.service sshd.service
AllowIsolate=yes
Restart Seçeneği
Açıklaması şöyle
Restart= Configures whether the service shall be restarted when the service process exits, is killed, or a timeout is reached....
Şöyle yaparız
Restart=always
RestartSec=0
4 [Slice] Başlığı
Şöyle yaparız.
$ systemctl --user cat mozilla.slice 
# /home/anthony/.config/systemd/user/mozilla.slice
[Unit]
Description=Slice for Mozilla apps
Before=slices.target

[Slice]
MemoryAccounting=yes
MemoryHigh=5G
MemoryMax=6G

$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/firefox &
$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/thunderbird &

Hiç yorum yok:

Yorum Gönder