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
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.
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.
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
[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ızif [[ $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
[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 &