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?
Jawaban:
Selain apa yang ditemukan oleh TokyoMEWS sendiri ...
(yang tidak sepenuhnya benar -
Type=forking
hanya menjadi perlu jika skrip Anda keluar saat anak-anaknya berjalan )... masalah lain yang mungkin terjadi adalah:
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).
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]
).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.sumber
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 .
sumber