Làm thế nào để tạm dừng một tập lệnh tại một thời điểm cụ thể cho đến khi nó được bắt đầu lại bởi cron?


12

Tôi có Raspberry Pi chạy OSMC (dựa trên Debian).

Tôi đã thiết lập một công việc định kỳ để bắt đầu một kịch bản, sync.sh, vào lúc nửa đêm.

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

Tôi cần dừng kịch bản lúc 7 giờ sáng. Hiện tại tôi đang sử dụng:

0 7 * * * shutdown -r now

Có cách nào tốt hơn? Tôi cảm thấy như khởi động lại là quá mức cần thiết.

Cảm ơn

Câu trả lời:


25

Bạn có thể chạy nó bằng timeoutlệnh ,

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. 

Tái bút Nếu quá trình đồng bộ hóa của bạn mất quá nhiều thời gian, bạn có thể xem xét một cách tiếp cận khác để đồng bộ hóa dữ liệu của mình, có thể chặn sao chép.


Kết nối internet của tôi chậm do đó mất nhiều thời gian để đồng bộ hóa. Bạn có đề nghị bất kỳ tín hiệu cụ thể?
Anthony

@Anthony làm thế nào để bạn đồng bộ hóa ngay bây giờ?
Rabin



@Anthony bạn có thể thử ứng dụng khác như syncthing ( syncthing.net ) hoặc BTSync ( resilio.com ), hoạt động ở cấp độ khối của tệp để đồng bộ hóa
Rabin

9

Nếu đồng bộ hóa của bạn có thể dễ dàng tiếp tục sau 17 giờ ngủ đông, hãy thử

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

Nếu đồng bộ hóa của bạn thích khởi động lại từ đầu, hãy thử

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

Nếu đồng bộ hóa hoặc nhiệm vụ của bạn bỏ qua tín hiệu nhưng không để lại mảnh vỡ, hãy thực hiện điều đó

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

killallpsmisc


Tôi đang sử dụng tập lệnh được tìm thấy bên dưới, với gương -c dường như không có ý định khởi động lại. Bạn muốn giới thiệu loại nào ở trên?: Gist.github.com/feralhosting/4e7e93a7fecd8f55cb4a
Anthony

Thấy rằng tập lệnh LFTP muốn SIGTERM dọn sạch tệp khóa của nó và xem xét khả năng hết thời gian của máy chủ trong 17 giờ nhàn rỗi hoặc thậm chí tệ hơn là in lại [64], tôi sẽ chọn 0 0 * * * timeout 7h /usr/local/bin/sync.shhoặc killall -TERMbiến thể gần như tương đương của tôi .
Roman Czyborra

4

Tôi cũng sẽ sử dụng cron để "dừng" hoặc "giết" dịch vụ hoặc tập lệnh đó tại một thời điểm nhất định.
Đầu tiên tạo công việc định kỳ của bạn để chạy công việc hoặc tập lệnh của bạn. (bạn có thể dễ dàng chạy một cron khác sẽ giết một công việc có tên sudo pkill wget)

Thứ hai, bạn muốn xem các tác vụ crontab đang chạy, ở định dạng hữu ích và dễ đọc, trong đầu ra của:

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

Chúng sẽ xuất hiện trong những dòng đầu tiên, đại loại như thế này:

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

Cột đầu tiên là PID, thứ hai là ID phiên và thứ ba là lệnh bắt đầu bằng cron. Bạn có thể hủy tất cả các quy trình liên quan đến một tác vụ cron cụ thể bằng ID phiên, vì vậy trong ví dụ trên, bạn nên hủy ID phiên 4289:

   pkill -s 4289

Bạn cần đặt pkill trong một tập lệnh và chạy nó dưới dạng cron


ID phiên sẽ thay đổi mỗi khi công việc định kỳ chạy? Thế còn sau khi tắt nguồn và bật?
Anthony

vâng nó sẽ thay đổi. Nhưng nếu bạn viết kịch bản, bạn có thể lấy PID và đặt nó vào một biến. Bạn có thể chỉ cần sử dụng tên nếu nó xuất hiện. pkill sync.sh
ddlingo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.