Systemd tidak dapat memulai skrip?

9

Saya memiliki skrip BASH yang ingin saya jalankan saat start up. Sistem saya menjalankan systemd jadi saya membuat file .service dengan apa yang saya pikir adalah informasi yang diperlukan:

[Unit]
Description=My Script
After=network.target

[Service]
ExecStart=/home/myscript.sh

[Install]
WantedBy=multi-user.target

Saya menggunakan systemctl memungkinkan untuk 'mendaftar' itu reboot. Pada saat boot saya diberitahu bahwa skrip saya akan dieksekusi, tetapi saya tidak dapat melihat satu pun pesan yang harus ditampilkan ECHO di layar dan juga tidak menulis sesuatu ke file, sesuai dengan apa yang saya tulis dalam skrip. Selain itu, itu tidak memulai aplikasi yang seharusnya dimulai.

Status Systemctl memberi tahu saya bahwa skrip telah berjalan dan keluar dengan sukses. Namun, skrip tidak memiliki efek. Jika saya menjalankan skrip dari shell itu berfungsi dengan baik.

Apakah ada di antara Anda yang tahu apa yang bisa menjadi masalah saya?

TokyoMEWS
sumber
3
Rupanya, jika skrip Anda memulai sesuatu yang lain itu perlu "Type = forking" Saya merasa sedikit bodoh karena tidak main-main dengan pengaturan sebelumnya.
TokyoMEWS
1
+1 untuk menyelesaikannya. Silakan kirim solusi Anda sebagai jawaban dan terima untuk membantu orang lain dengan masalah yang sama.
terdon
1
@TokyoMEWS: Lebih tepatnya, jika skrip memulai sesuatu yang lain dan keluar saat anak-anaknya berjalan, ia membutuhkan "Type = forking".
user1686

Jawaban:

7

Selain apa yang ditemukan oleh TokyoMEWS sendiri ...

Rupanya, jika skrip Anda memulai sesuatu yang lain, ia perlu "Type = forking"

(yang tidak sepenuhnya benar - Type=forkinghanya menjadi perlu jika skrip Anda keluar saat anak-anaknya berjalan )

... masalah lain yang mungkin terjadi adalah:

  1. Saya menduga bahwa dengan "tampilan di layar" Anda berarti bahwa skrip hanya menulis sesuatu untuk stdout. Ini tidak masuk ke layar saat boot - melainkan, segala sesuatu dari stdout layanan dikirim ke jurnal (atau ke syslog tergantung pada versi systemd Anda).

  2. Jika Anda benar - benar mencoba menulis ke layar (misalnya menggunakan echo Hi >/dev/tty1), maka sangat mungkin bahwa output skrip menghilang ketika agetty membersihkan layar sebelum menampilkan prompt login. (Untuk menghindari itu, Anda harus memesan unit [email protected]).

  3. Untuk menulis sesuatu ke file, Anda harus memiliki sistem file yang terpasang baca-tulis. Untuk ini, After=local-fs.target mungkin diperlukan, jika tidak unit ini mungkin dimulai terlalu dini. Tetapi ini tergantung pada konfigurasi OS tertentu.

pengguna1686
sumber
1

Jika skrip Anda mendefinisikan klausa ExecStop juga, Anda perlu mengatur " RemainAfterExit = ya" untuk menghindari ExecStop dipanggil secara otomatis setelah ExecStart . Ini akan memungkinkan layanan Anda dalam status " aktif " setelah mengeksekusi perintah ExecStart .

[Service]
ExecStart=/home/myscript.sh start
ExecStop=/home/myscript.sh stop
RemainAfterExit=yes
ibai
sumber