Saya baru saja memutakhirkan dari CentOS 6.5 ke 7.0 dan saya tidak terlalu senang karena yang baru systemd
mungkin memberi saya masalah. Sepertinya itu hanya boot terlalu cepat, memulai proses secara tidak sinkron dan mengacaukan dependensi layanan.
Misalnya saya memiliki beberapa pengaturan skrip crond
yang dipicu setelah reboot:
@reboot /root/scripts/check_gmail.sh
@reboot /root/scripts/start_gps_listener.sh
Ini menghasilkan semua jenis kesalahan aneh (hanya menunjukkan salah satunya):
Warning: stream_socket_client(): unable to connect to tcp://192.168.20.4:4001
(Network is unreachable) in /root/scripts/check_gmail.php on line 137
ERROR: Network is unreachable (101)
Di atas saya menulis ke soket TCP. Cukup jelas bagi saya bahwa crond
dimulai sebelum jaringan diinisialisasi dengan benar sebagai network is unreachable
.
Hal yang sama berlaku dengan Apache dan MySQL (MariaDB). MySQL cukup lambat untuk startup (banyak data) yang berarti bahwa baik Apache dan banyak crond
skrip startup saya gagal karena database MySQL tidak berjalan ketika skrip dipanggil.
Saya telah mencoba mengatur dependensi tetapi tidak berhasil; Saya telah menambahkan network
dan mysql
layanan ke [Unit]
(seperti yang terlihat dengan systemctl list-dependencies
). Idealnya semua layanan menunggu hingga MySQL aktif dan berjalan:
vi /lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target network.service mysql.service
vi /lib/systemd/system/crond.service
[Unit]
Description=Command Scheduler
After=syslog.target auditd.service systemd-user-sessions.service time-sync.target network.service mysql.service
Saat boot dengan yang di atas saya mendapatkan kesalahan yang sama. Saya juga menerima surel mailq
karena jaringan / DNS tidak siap ketika memproses skrip-skrip. Beberapa menit setelah startup mereka dikirim dengan benar.
Adakah yang bisa membantu memperbaiki ini dengan memastikan layanan dipecat dalam urutan yang benar? Tampaknya sangat salah bahwa ini adalah boot yang sangat cepat dan idealnya melakukannya dengan cara lama yang baik, "meluncurkan satu serice ... tunggu ... meluncurkan layanan baru ... tunggu ... seterusnya).
Perhatikan bahwa saya tidak yakin itu adalah systemd
masalah saya - itu hanya teori saya tentang apa yang bisa saya baca dari internet.
grep -i concurrency /etc/default/rcS
? Saya mungkin mencampur sistem init saya, tetapi saya sepertinya ingat bahwa mengontrol apakah proses menunggu satu sama lain untuk menyelesaikan./etc/default/rc*
Requires=network.target
ke unit di atas.Requires=network.target
ke/lib/systemd/system/crond.service
Jawaban:
Setelah lebih banyak membaca saya menemukan solusi yang cocok untuk saya.
Saya membaca panduan ini, Menjalankan Layanan Setelah Jaringan menyala . Kutipan kecil dari panduan ini:
Inilah yang saya inginkan jadi saya mengaktifkan layanan ini dan menetapkan aturan dependensi dalam file layanan untuk
crond
:Karena
mysqld
masih didasarkan pada yang lamainit.d
saya perlu membuatsystemd
layanan seperti yang disarankan di sini, systemctl memungkinkan berbeda dari systemctl mulai :Dan akhirnya setup layanan Apache untuk startup setelah MySQL:
Setidaknya ini bekerja untuk saya.
Saya telah menggunakan perintah ini untuk memeriksanya setelah itu di mana saya dapat dengan jelas melihat bahwa jaringan dijalankan sebelum setidaknya MySQL dan Apache. Meskipun saya tidak bisa melihat di
crond
mana saja tetapi saya bisa melihatnya berfungsi di skrip saya:Beberapa perintah berguna lainnya yang saya gunakan adalah:
Jika ada yang bisa melihat cara yang lebih baik untuk melakukan ini maka silakan bagikan.
sumber
systemd-analyze critical-chain
. Saya tidak hanya akan sering menggunakannya, tetapi tiba-tiba saya dijualsystemd
. Terima kasih!