Saya ingin menjalankan skrip shell secara harfiah setelah setiap 3 hari. Menggunakan crontab dengan 01 00 */3 * *
benar-benar tidak akan memenuhi syarat, karena akan berjalan pada tanggal 31 dan sekali lagi pada hari pertama dalam sebulan. The */3
sintaks adalah sama dengan mengatakan 1,4,7 ... 25,28,31.
Seharusnya ada cara untuk membuat skrip itu sendiri memeriksa kondisi dan keluar jika 3 hari belum berlalu. Jadi crontab mengeksekusi skrip setiap hari, tetapi skrip itu sendiri akan memeriksa apakah 3 hari telah berlalu.
Saya bahkan menemukan beberapa kode, tetapi itu memberi saya kesalahan sintaks, bantuan apa pun akan dihargai.
if (! (date("z") % 3)) {
exit;
}
main.sh: line 1: syntax error near unexpected token `"z"'
main.sh: line 1: `if (! (date("z") % 3)) {'
command-line
bash
scripts
cron
Taavi
sumber
sumber
*/3
tidak bekerja "jika 3 hari belum berlalu": tiga hari sejak apa? Harap edit pertanyaan Anda dan klarifikasi.date("z") % 3 == 0
akan menderita masalah yang sama: kondisinya akan salah selama empat hari antara 29 Desember dan 3 Januari, kecuali jika Desember itu adalah bagian dari tahun kabisat.Jawaban:
Untuk segera membatalkan dan keluar dari skrip jika eksekusi terakhir belum setidaknya pada waktu yang lalu, Anda dapat menggunakan metode ini yang memerlukan file eksternal yang menyimpan tanggal dan waktu eksekusi terakhir.
Tambahkan baris ini ke bagian atas skrip Bash Anda:
Jangan lupa untuk menetapkan nilai yang berarti
datefile=
dan sesuaikan nilaiseconds=
dengan kebutuhan Anda ($((60*60*24*3))
dievaluasi hingga 3 hari).Jika Anda tidak ingin file terpisah, Anda juga bisa menyimpan waktu eksekusi terakhir di cap waktu modifikasi skrip Anda. Namun itu berarti bahwa membuat perubahan apa pun pada file skrip Anda akan mengatur ulang penghitung 3 dan diperlakukan seperti jika skrip berhasil dijalankan.
Untuk menerapkannya, tambahkan snippet di bawah ini ke bagian atas file skrip Anda:
Sekali lagi, jangan lupa untuk menyesuaikan nilai
seconds=
dengan kebutuhan Anda ($((60*60*24*3))
dievaluasi hingga 3 hari).sumber
$[ $(date +%s) - $(< lastrun) ]
. Jika skrip dijalankan dari cron sekali sehari, saya mungkin menambahkan beberapa slack ke interval waktu yang diperlukan, sehingga jika eksekusi skrip tertunda beberapa detik, waktu berikutnya tidak akan melewati satu hari penuh. Yaitu memeriksa setiap hari jika 71 jam telah melewati oslt.Cron benar-benar alat yang salah untuk ini. Sebenarnya ada alat yang biasa digunakan dan kurang diperhatikan yang disebut di mana mungkin bekerja. di terutama dirancang untuk penggunaan interaktif dan saya yakin seseorang akan menemukan cara yang lebih baik untuk melakukan ini.
Dalam kasus saya, saya akan memiliki skrip yang saya jalankan terdaftar di testjobs.txt, dan termasuk baris yang berbunyi.
Sebagai contoh, saya akan menggunakan ini sebagai testjobs.txt
Saya memiliki dua perintah yang tidak bersalah, yang mungkin merupakan skrip shell Anda. Saya menjalankan echo untuk memastikan saya memiliki keluaran deterministik, dan tanggal untuk mengonfirmasi perintah berjalan sesuai kebutuhan. Ketika di jalankan perintah ini, itu akan selesai dengan menambahkan pekerjaan baru ke selama 3 hari. (Saya diuji dengan satu menit - yang bekerja)
Saya cukup yakin saya akan dipanggil untuk cara saya dilecehkan, tetapi itu alat yang berguna untuk menjadwalkan perintah untuk dijalankan pada suatu waktu atau x hari setelah perintah sebelumnya.
sumber
at
sepertinya pendekatan yang lebih baik di sini. Masalah dengan pendekatan ini adalah bahwa setiap kali Anda menjalankan skrip secara manual, Anda menambahkan serangkaianat
tugas setiap 3 hari .at
ada di atas, atau berpotensi jauh lebih banyak jikaat
berada di dekat bagian bawah skrip eksekusi panjang)Pertama, fragmen kode di atas adalah sintaks Bash tidak valid, seperti Perl. Kedua,
z
parameter yangdate
menyebabkannya menampilkan zona waktu numerik.+%j
adalah nomor hari. Anda membutuhkan:Tapi Anda masih akan melihat keanehan di akhir tahun:
Anda mungkin lebih beruntung dengan menyimpan hitungan dalam file, dan menguji / memperbarui itu.
sumber
date()
fungsi bawaan, tetapi itu terlihat seperti date () di PHP (di manaz
"Hari dalam setahun (mulai dari 0)")Jika Anda dapat membiarkan skrip berjalan terus-menerus, Anda dapat melakukannya:
Loop ini selalu benar, sehingga selalu menjalankan kode, lalu menunggu selama tiga hari sebelum memulai loop lagi.
sumber
while true
?at
solusinya, ini akan melayang dengan waktu eksekusi skrip setiap kali dijalankan. Tentu saja itu dapat diatasi dengan menghemat waktu ketika skrip dimulai dan tidur hingga 3 hari dari itu.Anda dapat menggunakan anacron alih-alih cron, ia dirancang persis untuk melakukan apa yang Anda butuhkan. Dari halaman manual:
sumber