Bagaimana cara menghentikan skrip pada waktu tertentu hingga dimulai lagi oleh cron?

12

Saya memiliki Raspberry Pi yang menjalankan OSMC (berbasis Debian).

Saya telah menetapkan tugas cron untuk memulai skrip, sync.sh, pada tengah malam.

0 0 * * * /usr/local/bin sync.sh

Saya harus menghentikan skrip pada jam 7 pagi. Saat ini saya menggunakan:

0 7 * * * shutdown -r now

Apakah ada cara yang lebih baik? Saya merasa seperti me-reboot terlalu banyak.

Terima kasih

Anthony
sumber

Jawaban:

25

Anda dapat menjalankannya dengan timeoutperintah ,

timeout - run a command with a time limit

Synopsis
timeout [OPTION] NUMBER[SUFFIX] COMMAND [ARG]...
timeout [OPTION]
Description

Start COMMAND, and kill it if still running after NUMBER seconds. SUFFIX may be 's' for seconds (the default), 'm' for minutes, 'h' for hours or 'd' for days. 

PS. Jika proses sinkronisasi Anda terlalu banyak waktu, Anda mungkin mempertimbangkan pendekatan berbeda untuk menyinkronkan data Anda, mungkin memblokir replikasi.

Rabin
sumber
Koneksi internet saya lambat karena itu butuh waktu lama untuk sinkronisasi. Apakah Anda merekomendasikan sinyal tertentu?
Anthony
@Anthony bagaimana Anda menyinkronkan sekarang?
Rabin
lftp.tech
Anthony
@Anthony Anda dapat mencoba aplikasi lain seperti syncthing ( syncthing.net ) atau BTSync ( resilio.com ), yang berfungsi pada level blok file yang akan disinkronkan
Rabin
9

Jika sinkronisasi Anda dapat dengan mudah dilanjutkan setelah hibernasi 17 jam, coba

0 0 * * * killall -CONT -g sync.sh || /usr/local/bin/sync.sh
7 0 * * * killall -STOP -g sync.sh

Jika sinkronisasi Anda lebih suka memulai ulang dari awal, coba

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -TERM -g sync.sh

Jika sinkronisasi atau subtugas Anda mengabaikan sinyal tetapi tidak meninggalkan puing-puing, lakukan itu

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -KILL -g sync.sh

killallpsmisc

Roman Czyborra
sumber
Saya menggunakan skrip yang ditemukan di bawah ini, dengan mirror -c sepertinya tidak keberatan restart. Manakah dari hal di atas yang akan Anda rekomendasikan ?: gist.github.com/feralhosting/4e7e93a7fecd8f55cb4a
Anthony
Melihat skrip LFTP yang menginginkan SIGTERM untuk membersihkan lockfile-nya dan mempertimbangkan kemungkinan timeout server pada 17 jam idle atau bahkan lebih buruk lagi inet [64], saya akan memilih varian yang 0 0 * * * timeout 7h /usr/local/bin/sync.shhampir sama killall -TERM.
Roman Czyborra
4

Saya juga akan menggunakan cron untuk "menghentikan" atau "membunuh" layanan atau skrip itu pada waktu yang ditentukan.
Pertama buat pekerjaan cron Anda untuk menjalankan pekerjaan atau skrip Anda. (Anda dapat dengan mudah menjalankan cron lain yang akan mematikan pekerjaan yang memiliki nama sudo pkill wget)

Kedua, Anda ingin melihat menjalankan tugas-tugas crontab, dalam format yang bermanfaat dan dapat dibaca, di output dari:

   ps -o pid,sess,cmd afx | egrep "( |/)cron( -f)?$"

Mereka akan muncul di baris pertama, kira-kira seperti ini:

1108  1108 cron
4288  1108 \_ CRON
4289  4289     \_ /bin/sh -c /path/to/my/crontab/script1.sh
4290  4289         \_ /bin/bash /path/to/my/crontab/script1.sh
4295  4289             \_ /usr/bin/wget LINK

Kolom pertama adalah PID, kedua adalah Session ID dan ketiga adalah perintah yang dimulai oleh cron. Anda dapat membunuh semua proses yang terkait dengan tugas cron tertentu menggunakan ID Sesi, jadi dalam contoh di atas Anda harus membunuh Session ID 4289:

   pkill -s 4289

Anda perlu memasukkan pkill ke dalam skrip dan menjalankannya sebagai cron

ddlingo
sumber
Apakah ID Sesi akan berubah setiap kali pekerjaan cron berjalan? Bagaimana dengan setelah mematikan dan menghidupkan?
Anthony
ya itu akan berubah. Tetapi jika Anda skrip, Anda bisa mendapatkan PID dan menempatkannya ke dalam variabel. Anda mungkin bisa menggunakan nama saja jika muncul. pkill sync.sh
ddlingo