Apakah ada cara untuk mengakses cron
timer dan dapatkan sisa detik hingga eksekusi skrip berikutnya di crontab
atau mungkin detik sejak terakhir?
Jawaban yang Diterima:
Tidak mudah. crond menunggu sinyal dari kernel dan pergi tidur. Saat mendapat sinyal, ia akan memeriksa apakah ada cronjob yang akan dieksekusi pada menit itu, meluncurkannya, dan kembali ke mode tidur.
Ini adalah desain yang sangat efisien – cron tidak menggunakan CPU apa pun saat sedang tidur. Itu juga tidak memiliki kesadaran akan waktu yang berlalu. Saat masuk ke mode tidur, ia menetapkan "batas waktu" berdasarkan berapa lama sebelum perintah berikutnya dari cronjob "terdaftar" harus dijalankan.
Di Solaris 10:
sol10-primary:/> # pflags 271
271: /usr/sbin/cron
data model = _ILP32 flags = ORPHAN|MSACCT|MSFORK
/1: flags = ASLEEP pollsys(0x8047c70,0x1,0x8047ce8,0x806ba00)
Saat menelusuri daemon cron, Anda akan melihatnya tertidur dengan batas waktu, seperti di bawah ini:
waitid(P_ALL, 0, 0x08047CD0, WEXITED|WTRAPPED|WNOHANG) Err#10 ECHILD
time() = 1361952435
pollsys(0x08047C70, 1, 0x08047CE8, 0x0806BA00) (sleeping...)
fd=3 ev=POLLRDNORM rev=0
timeout: 105.000000000 sec
sigmask = 0 0 0 0
Saat Anda memperbarui tugas cron, proses tidur juga dibangunkan tetapi untuk memperbarui konfigurasinya sendiri, setelah itu akan kembali tidur dengan nilai batas waktu yang baru.
Hal ini dimungkinkan untuk melihat batas waktu yang telah ditetapkan. Perhatikan bahwa cron memanggil syscall waktu sebelum tidur (yang mengembalikan detik sejak epoc), jadi jika Anda telah mengamati ini (yaitu melacak proses ketika memanggil time() syscall, Anda akan dapat mengurangi waktu itu dari saat ini dan bandingkan dengan batas waktu yang ditetapkan pada panggilan pollsys.
Jadi… seperti yang saya katakan, tidak mudah.