Chạy một cronjob với các thông số khác nhau mỗi ngày


12

Tôi là một lập trình viên, và không biết nhiều về các con dơi, nhưng tôi muốn biết nếu điều này là có thể.

Hãy nói rằng tôi có một mảng [option1, option2, option3]và một kịch bản mà tôi chạy trong NodeJS được gọi script.js. Tôi muốn chạy tập lệnh này mỗi ngày vào lúc 1 giờ sáng. Các cronlệnh này sẽ là:

0 1 * * * node ~/script.js

Bây giờ là phần khó khăn, tôi muốn xoay các tùy chọn mỗi ngày, vì vậy, ví dụ thứ hai tôi muốn chạy node ~/script.js option1, vào ngày hôm sau node ~/script.js option2và cứ thế. Ngoài ra, tôi muốn có thể thêm / xóa tùy chọn khi cần, nhưng vòng quay vẫn được giữ nguyên.

Điều này có thể trong bất kỳ cách nào? Tôi biết tôi cũng có thể làm điều này trong nút, nhưng tôi muốn làm điều này từ bên ngoài tập lệnh và để nguyên tập lệnh.


2
Tôi sẽ khuyên bạn nên viết kịch bản này và cố gắng để cron tự làm nó.
earthmeLon

Câu trả lời:


15

Ngoài ra, tôi muốn có thể thêm / xóa tùy chọn khi cần, nhưng vòng quay vẫn được giữ nguyên.

Đó là khó khăn. Điều này có nghĩa là gì khi vòng quay vẫn giữ nguyên sau khi sửa đổi danh sách các tùy chọn? Rốt cuộc, bạn có thể xây dựng lại hoàn toàn danh sách, phá hủy mọi manh mối về nơi bạn ở.

Những gì bạn có thể có thể làm là thiết lập một thư mục với các tệp đại diện cho các tùy chọn của bạn (thông qua tên tệp hoặc nội dung của chúng). Sau đó, bất cứ khi nào công việc định kỳ thực thi, bạn sẽ liệt kê thư mục đó, sắp xếp các tệp theo thời gian sửa đổi lần cuối. Bạn lấy mục cũ nhất, touchtệp đó để thay đổi thời gian sửa đổi của nó thành thời gian hiện tại, sau đó sử dụng nó để chạy tập lệnh.

#!/bin/bash
cd ~/script-options
next=$(ls -rt | head -n1)
touch -- "${next}"
node ~/script.js ${next} or $(<"${next}")

Nếu bạn muốn, bạn cũng có thể viết điều này trong một dòng cho cron, mặc dù nó sẽ trở nên khó đọc hơn.

Thêm tùy chọn có nghĩa là thêm tệp mới vào thư mục tùy chọn. Xóa tùy chọn có nghĩa là xóa các tập tin. Tại bất kỳ thời điểm nào, tệp cũ nhất là tệp sẽ được chạy tiếp theo, vì vậy các tùy chọn mới sẽ được thêm vào cuối chu kỳ, như thể nó vừa được chạy. Nếu bạn muốn sắp xếp lại các tùy chọn, bạn có thể chạm vào chúng theo bất kỳ thứ tự nào bạn muốn.


Hoàn toàn +1 cho cách bạn quản lý tuần tự tùy chọn trên "danh sách chỉnh sửa".
Hagen von Eitzen

Cảm ơn câu trả lời, tôi thích nó và sẽ sử dụng nó. Thứ tự chính xác của vòng quay không quan trọng khi tôi thêm cái mới vào danh sách. Điều duy nhất quan trọng là tất cả họ đều được chạy 1-2 mỗi tuần mỗi tuần chứ không phải hai trong cùng một ngày.
Saif Bechan

2
$(ls -rt | head -n1)tất nhiên sẽ phá vỡ tên tập tin bao gồm các dòng mới, nhưng với mục đích này, bạn có thể có thể thoát khỏi chỉ với "đừng làm điều đó".
cjm

20

Giả sử bạn muốn có một tùy chọn khác nhau cho mỗi ngày trong tuần. Bạn có thể:

  1. Có một công việc định kỳ riêng cho những việc này:

    0 1 * * 0 node ~/script.js option1
    0 1 * * 1 node ~/script.js option2
    0 1 * * 2 node ~/script.js option3
    

    Vân vân...

  2. Đã bashcung cấp các tùy chọn mong muốn cho bạn:

    0 1 * * * node ~/script.js case `date +%u` in 0 ) echo option1 ;; 1 ) echo option2 ;; 2 ) echo option3 ;;  esac
    

    (Tôi đã không chạy cái sau, vì vậy nó có thể cần một số điều chỉnh - nhưng đó là ý tưởng chung.)


2
Cảm ơn câu trả lời, nhưng tôi nghĩ nó sẽ trở nên lộn xộn. Tôi thực sự cần xác định một mảng ở đâu đó, nếu không nó sẽ không hoạt động. Tôi không thể làm việc với echo option1vv, vì các tùy chọn của tôi có thể thay đổi từ tuần này sang tuần khác. Tôi chỉ cần làm điều này trong ứng dụng Node của mình và theo dõi cái nào tôi đã chạy cuối cùng trong db của mình.
Saif Bechan

13

Không, tôi có thể nghĩ không có cách nào sạch sẽ để làm điều này. Chỉ cần viết một tập lệnh trình bao bọc đơn giản để kiểm tra ngày và khởi động ứng dụng nút của bạn với các tùy chọn cần thiết mỗi ngày.


+1 chìa khóa là 'không có cách nào sạch'.
Paolo
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.