Systemd: bagaimana membuat layanan systemd dimulai setelah jaringan terhubung penuh?

12

Latar Belakang

Saya menulis skrip sederhana untuk dijalankan di Raspbain pada Raspberry Pi 2, sederhana menyalakan LED untuk menunjukkan saya siap terhubung dengan SSH dari komputer desktop saya.

Skrip tidak penting di sini, hanya untuk menyebutkan bahwa ketika saya menggunakan kontrol frekuensi sehingga skrip menjalankan loop tak terbatas, untuk sering menyalakan dan mematikan LED. Jadi ini adalah contoh layanan sederhana. Namun, setidaknya jawaban yang diterima dari pertanyaan ini menyarankan saya untuk mengatur tipe ke idle. Jadi file layanan saya terlihat seperti

[Unit]
Description=Turn on LED after SSH is ready

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
Wants=network-online.target
After=network-online.target

Efek

Layanan berjalan seperti yang diharapkan. Namun, saya perhatikan ketika saya mulai dempul di komputer desktop saya tepat setelah LED menyala pada prompt login tidak muncul segera. Jadi saya memeriksa

$ systemd-analyze plot > output.svg

Hasilnya menunjukkan

masukkan deskripsi gambar di sini

Pertanyaan

Sepertinya layanan saya dimulai bukan setelahnya network-online.target, apa yang salah di sini dan bagaimana cara memperbaikinya?

Mesin Tanah
sumber

Jawaban:

12

Ketika ada pertanyaan tentang arahan systemd, Anda dapat menggunakan man systemd.directivesuntuk menemukan di mana itu didokumentasikan. Dalam hal ini menunjukkan bahwa After=itu didokumentasikan dalam man systemd.unit.

Dalam file itu, itu menunjukkan bahwa After=direktif tercantum dalam "PILIHAN BAGIAN" [UNIT], yang menunjukkan bahwa itu termasuk dalam [Unit]bagian file.

Dokumentasi yang sama juga mendokumentasikan opsi bagian [INSTALL], dan After=tidak terdaftar di sana.

Singkatnya, After=arahan Anda berada di lokasi yang salah, file unit sehingga tidak berpengaruh sampai Anda memindahkannya ke lokasi yang benar.

Mark Stosberg
sumber
Untuk menjadi jelas, dalam hal ini "[Unit]" adalah "[Layanan]", karena ini adalah file layanan.
faho
Jawaban yang dapat di-paste dengan koreksi akan jauh lebih baik!
GerardJP
@ GerardJP Lebih baik mengajar seorang pria untuk memancing kemudian memberinya makan selama sehari. Setelah orang tahu cara menggunakan dokumentasi systemd, mereka dapat menemukan jawaban yang otoritatif tanpa menghabiskan waktu di StackExchange melihat dokumen pihak ketiga.
Mark Stosberg
11

Perbaiki dengan memodifikasi layanan sebagai

[Unit]
Description=Turn on LED after SSH is ready
After=network-online.target

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
WantedBy=network-online.target

Masih belum sepenuhnya mengerti apa yang saya lakukan, tetapi berhasil sekarang. Adakah yang bisa dijelaskan?

Memperbarui

Jawaban ini dibuat sendiri sebelum jawaban yang diterima datang.

Mesin Tanah
sumber
Bahwa After=arahan harus ada di [Unit]bagian. Hanya itu saja.
Bigon