Bagaimana cara membuat layanan systemd saya berjalan melalui pengguna tertentu dan mulai saat boot?

133

Saya baru saja memutakhirkan dari server Ubuntu 14 ke versi 15. Saya mengalami kesulitan membuat skrip pemula saya berfungsi setelah peningkatan, dan membaca bahwa systemd adalah default baru. Saya jauh dari ahli linux, jadi tolong mudahkan saya :-)

Berikut ini skrip pemula saya sebelumnya:

description "NZBGet upstart script"

setuid robert
setgid robert

start on runlevel [2345]
stop on runlevel [016]

respawn

expect fork

script
    exec nzbget -D
end script

pre-stop script
    exec nzbget -Q
end script

Berdasarkan halaman wiki pemula untuk systemd , saya menggunakan tabel yang disediakan di sana untuk memetakan hal-hal sedekat mungkin dalam file layanan systemd baru saya:

[Unit]
Description=NZBGet Service

[Service]
Type=forking
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure

File ini terletak di /home/robert/.config/systemd/user/nzbget.service. Untuk memulai layanan secara manual, saya telah melakukan:

$ systemctl --user start nzbget

Ini sangat bagus. Namun, ketika saya keluar dari sesi SSH saya, layanan dimatikan. Juga, ini tidak dimulai saat bootup atau login pengguna. Saya ingin berperilaku sama seperti yang dilakukan sebagai layanan pemula: Saya ingin itu mulai saat boot, berjalan terus-menerus, dan sebagai pengguna tertentu.

Apa yang harus saya lakukan untuk mendapatkan konfigurasi ini?

void.pointer
sumber

Jawaban:

164

Masalah pertama

Anda dapat menentukan arahan User=dan Group=di [Service]bagian file unit.

Masalah kedua

Untuk membuat layanan berjalan saat boot, Anda tidak harus meletakkannya di folder rumah Anda. Sebaliknya, letakkan di bawah /etc/systemd/system/. Ini adalah folder yang dimaksudkan untuk digunakan oleh administrator sistem (yaitu Anda) untuk menambahkan layanan seluruh sistem baru.

Folder lain termasuk:

  • /usr/lib/systemd/system/dimaksudkan untuk paket yang ingin menginstal file unit, meskipun di bawah Debian dan Ubuntu folder sebenarnya /lib/systemd/system/karena berbagai bindan libfolder belum digabungkan ke dalam /usr/awalan terpadu .
  • /usr/local/systemd/system/ adalah untuk menginstal unit dengan paket yang dikompilasi secara lokal.

Menguji unit

Setelah file unit berada di lokasi yang sesuai, Anda dapat mencoba memulai unit dengan mengetik systemctl start <UNIT_FILENAME>seperti biasa. Ini harus bekerja tanpa harus mengetikkan path lengkap unit. Ekstensi juga tidak harus ditentukan jika itu .service.

Mengaktifkan unit

Sebelum Anda dapat mengaktifkan unit Anda, Anda perlu menambahkan [Install]bagian, di mana Anda harus menambahkan arahan WantedBy=multi-user.target. Arahan ini menentukan tahapan proses boot-up di mana layanan harus dimulai (jika diaktifkan). multi-user.targetsesuai untuk sebagian besar layanan.

Setelah informasi itu ditambahkan, Anda dapat menggunakan systemctl enable <UNIT_FILENAME>, yang memungkinkan unit, membuat systemd mulai sekarang secara otomatis memulai saat boot pada tahap yang ditentukan.

Yamaho
sumber
Ini berhasil. Saya harus menentukan jalur absolut ke nama file layanan dalam systemctl enableperintah, ini tidak jelas bagi saya pada awalnya. Juga mengaktifkan memberi saya beberapa peringatan tentang [Install]bagian yang hilang . Saya mengabaikannya, tapi saya tidak yakin apakah ini akan memengaruhi kemampuannya untuk memulai saat boot.
void.pointer
2
The Installperingatan itu sebenarnya sangat penting. Itu tidak akan mulai saat boot tanpa di WantedBy=multi-user.targetbawah [Install]bagian. Setelah menambahkan ini ke .servicefile, maka Anda bisa enablemelakukannya.
void.pointer
4
Saya minta maaf tentang meninggalkan jawaban tanpa pengawasan untuk waktu yang lama. Saya memperbaiki lokasi di mana file unit harus pergi, menambahkan informasi yang hilang tentang [Install]bagian. Semoga sekarang lebih bermanfaat bagi siapa pun yang mencarinya.
Yamaho
5
Ini menjadi lebih mudah ketika nama pengguna di-templated, yaitu layanan Anda didefinisikan dengan nama file dalam format [email protected]kemudian enabled seperti [email protected]pengaturan menjadi User=%iberarti pengguna tidak memiliki kode keras dan banyak pengguna dapat menggunakan definisi yang sama. Sebuah contoh.
Walf
1
Apakah akan mulai jika saya letakkan di bawah /etc/systemd/user/?
Khurshid Alam
46

Anda mungkin tertarik menggunakan fungsionalitas "user lingering" systemd. Ini diaktifkan melalui loginctl enable-linger USERNAME.

Ini menyebabkan manajer layanan terpisah untuk masing-masing pengguna yang memulai boot, sehingga unit yang ditentukan pengguna ~/.config/systemd/userakan diambil dan diproses pada waktu boot dan shutdown sesuai dengan konfigurasi layanan Anda.

Anda juga dapat menggunakan systemctl --useruntuk mengelola dan mengkonfigurasi layanan, yang akan beroperasi pada manajer layanan pengguna Anda, bukan yang ada di sistem.

byteborg
sumber
6
systemctl --useradalah temuan yang fantastis. Terima kasih!
Anwar
@byteborg Mungkin Anda bisa berkontribusi di unix.stackexchange.com/questions/409900/… ? Saya perlu ketergantungan pada PostgreSQL di layanan pengguna yang tersisa, tetapi database tetap layanan sistem, bukan pengguna.
Michał F
1
Setelah layanan berjalan, apakah ada teknik yang dapat memungkinkan pengguna untuk melihat log layanan? Pengguna yang tidak memiliki hak tidak akan bisa mendapatkan ke / var / log / syslog.
mpr
2
Catatan yang systemctl --usertampaknya tidak berfungsi untuk sesi SSH.
Mark K Cowan
2
Harus menjadi solusi yang diterima
Drew