gagal memulai layanan

15

Saya telah membuat layanan systemd:

[Unit]
Description=My service

[Service]
Type=forking
ExecStart=/bin/sh $HOME/theFolder/run.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=mine.service

Saya memasukkannya ke folder / etc / systemd / system dan menamainya mine.service.

Jika saya menjalankannya sudo service mine startmemberi saya:

Gagal memulai mine.service.Unit mine.service tidak ditemukan

--- PEMBARUAN -----

Saya menjalankan dulu sudo systemctl daemon-reloaddan sekarang tidak memberi saya pesan apa pun tetapi layanan masih belum dimulai.

George
sumber
10
Sudahkah Anda menjalankan systemctl daemon-reloadsetelah membuat file unit Anda?
Wieland
@Wieland: Hmm..Sekarang ini tidak menunjukkan pesan apa pun kepada saya. Tapi, itu masih belum dimulai.
George
@don_crissti: Status mengatakan itu aktif, tetapi skrip (dalam ExecStart) tidak dieksekusi.
George
bagaimana bisa tahu $ HOME yang tepat? Apa yang Anda harapkan untuk layanan sistem?
Serge
@Serge: Hmm..Jadi, bagaimana saya bisa menggunakan $ HOME?
George

Jawaban:

14

$HOMEmenunjuk ke direktori home pengguna yang menjalankan skrip. Layanan Systemd dimulai dengan root sehingga kemungkinan akan berusaha /root/theFolder/run.sh. Gunakan jalur absolut dalam file layanan.

Anda juga memiliki forkingopsi yang ditetapkan. Ini diperlukan untuk program yang latar belakangnya sendiri, apakah skrip Anda melakukan ini? Kebanyakan tidak dan jika milik Anda tidak, Anda harus menghapus opsi ini atau systemd akan menunggu skrip Anda selesai untuk mengklaimnya sebagai dimulai.

Juga file layanan sistem yang mengarah ke skrip di direktori home Anda tidak disarankan dan mungkin masalah keamanan. Karena dijalankan sebagai root, siapa pun yang dapat memodifikasinya berpotensi mendapatkan akses root ke komputer Anda. Jauh lebih baik untuk menyalin skrip ke /usr/local/bindan memastikan itu dimiliki dan hanya dapat ditulisi oleh root untuk menghentikan ini. Ini juga merupakan ide yang baik untuk menjalankan skrip sebagai pengguna yang tidak memiliki hak menggunakan User=dan Group=opsi dalam file layanan.

Jika Anda ingin menjalankannya sebagai pengguna Anda lebih baik memasukkan file layanan ~/.config/systemd/user/dan memulai / mengaktifkannya dengan systemctl --user enable yourservice && systemctl --user start yourservice(catatan, jalankan karena pengguna Anda tidak root). Lihat ini untuk info lebih lanjut tentang file layanan pengguna.

Michael Daffin
sumber
: Saya meletakkan skrip ke / usr / local / bin dan layanan ke /.config/systemd/user.Jika saya mencoba untuk mengaktifkan layanan, itu menunjukkan kepada saya "argumen berlebih". Jika saya mencoba menggunakan systemctl itu menunjukkan 'gagal' .. unit .. ', sesuatu seperti ini.
George
Bisakah Anda memberikan perintah lengkap yang Anda coba dan log yang lebih rinci. Sulit untuk di-debug dengan fragmen.
Michael Daffin
: Apakah ada solusi untuk menggunakan path $ HOME? Karena, jika saya meletakkan skrip di / usr / local / bin, ia menggunakan path relatif ke $ HOME . Saya melihat ini . Dan saya mencoba memasukkan HOME=$HOMEfile lingkungan pertama. Tetapi layanan tidak dapat memulai, tidak ada kesalahan.
George
1
di ubuntu saya harus menggunakan systemctl untuk ini bukan systemd, menggunakan systemd saya mendapat kesalahan "Kelebihan Argumen"
Alexander Mills
1
@AlexanderMills Anda benar, perintah yang benar dalam systemctl dan systemd hanya salah ketik dalam jawabannya.
Michael Daffin