Bisakah saya me-restart systemd tanpa me-reboot?

39

Saya mencoba memulai kembali layanan setelah yum updatepada RHEL 7.4. Saya dapat me-restart setiap layanan menggunakan systemctl, tetapi needs-restartingdari yum utilsmemberitahu saya bahwa saya juga harus me-restart systemd sendiri:

# needs-restarting
1 : /usr/lib/systemd/systemd --system --deserialize 21

Bisakah saya memulai ulang systemdtanpa me-reboot server, dan bagaimana caranya?

Saya menemukan beberapa menyebutkan systemctl daemon-reload, tetapi ini tidak membuatnya menghilang dari daftar kebutuhan-restart.

Benjamin
sumber

Jawaban:

43

Untuk me-restart daemon, jalankan

systemctl daemon-reexec

Hal ini didokumentasikan di dalam systemctlmanualnya :

Menjalankan kembali manajer systemd. Ini akan membuat serial keadaan manajer, jalankan kembali proses dan deserialize negara lagi. Perintah ini tidak banyak berguna kecuali untuk debugging dan peningkatan paket. Terkadang, mungkin bermanfaat sebagai beban berat daemon-reload. Ketika daemon sedang dieksekusi kembali, semua soket systemd yang mendengarkan atas nama konfigurasi pengguna akan tetap dapat diakses.

Sayangnya needs-restartingtidak dapat menentukan bahwa systemdsebenarnya sudah dimulai ulang. systemd execsitu sendiri untuk me-restart, yang tidak mengatur ulang waktu mulai proses; tetapi needs-restartingmembandingkan waktu modifikasi yang dapat dieksekusi dengan waktu mulai proses untuk menentukan apakah suatu proses perlu di-restart (di antara hal-hal lain), dan sebagai hasilnya ia selalu menganggap bahwa systemdperlu di-restart ... Untuk menentukan apakah systemdbenar-benar perlu di-restart, Anda dapat memeriksa output dari lsof -p1 | grep deleted: systemdusing a library,, libsystemd-sharedyang dikirimkan dalam paket yang sama dan dengan demikian ditingkatkan bersama dengan daemon, jadi jika systemdperlu dimulai ulang Anda akan melihatnya menggunakan versi pustaka yang dihapus. Jika lsoftidak ada file yang dihapus, systemdtidak perlu dimulai ulang. (Terimakasih untukJeff Schaller untuk petunjuknya!)

Stephen Kitt
sumber
1
@Raman, daemon-reexecseharusnya bekerja bahkan dengan systemdpid 1.
Stephen Kitt
3
Inti dari restart kebutuhan sampai ke github.com/rpm-software-management/yum/blob/master/… di mana ia menanyakan "start_time" PID; jika daemon-reexec tidak memutakhirkannya, pengaktifan ulang kebutuhan akan tetap "membingungkan".
Jeff Schaller
1
Jangan berasumsi bahwa codepath apa pun yang terlibat telah teruji dengan baik, terutama pada sistem non-RedHat. Secara teknis dimungkinkan untuk menjalankan daemon-reexec, tetapi lebih aman untuk reboot.
Harald
2
@ Harald ini digunakan setiap kali ada yang memutakhirkan systemddi Debian dan turunannya, jadi sudah teruji dengan baik. Ini juga cukup mudah (cari do_reexecute).
Stephen Kitt
1
@StephenKitt - Ketika saya mencoba menjalankan lsof -p1 | grep deletedoutput berikut dihasilkan lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete. Dalam membaca ( unix.stackexchange.com/questions/171519/… ), tampaknya bahkan root tidak dapat mengaksesnya. Apa alternatifnya lsof -p1 | grep deleted?
Termotivasi
3

Dalam kasus saya, saya baru saja memutakhirkan systemddan systemctlperintah apa pun gagal:

# systemctl daemon-reexec
Failed to reload daemon: Access denied
# systemctl status
Failed to read server status: Access denied

Namun menurut halaman initmanual, Anda dapat melakukan hal yang sama dengan mengirim SIGTERMke daemon yang berjalan sebagai PID 1, yang berfungsi:

kill -TERM 1

Ini memuat ulang daemon, setelah semua systemctlperintah mulai bekerja lagi.

Malvine
sumber