Her gün farklı parametrelerle bir cronjob çalıştırmak


12

Ben bir programcıyım ve crons hakkında çok şey bilmiyorum, ama bunun mümkün olup olmadığını bilmek istiyorum.

Diyelim ki bir dizi [option1, option2, option3]ve NodeJS adlı bir komut dosyası var denir script.js. Bu betiği her gün sabah 1'de çalıştırmak istiyorum. Bunun cronkomutu şöyledir:

0 1 * * * node ~/script.js

Peki şimdi zor kısmı, seçenekleri her gün döndürmek istiyorum, bu yüzden örneğin pazartesi koşmak istiyorum node ~/script.js option1, ertesi gün node ~/script.js option2vb. Ayrıca, gerektiğinde seçenekler ekleyebilir / kaldırabilirim, ancak döndürme sağlam kalmalıdır.

Bu herhangi bir şekilde mümkün mü? Bunu düğüm içinde de yapabileceğimi biliyorum, ama bunu betiğin dışından yapmayı tercih ederim ve betiği olduğu gibi bırak.


2
Ben kendi başına cron almaya çalışırken vs vs bu komut dosyası tavsiye ederim.
earthmeLon

Yanıtlar:


15

Ayrıca, gerektiğinde seçenekler ekleyebilir / kaldırabilirim, ancak döndürme sağlam kalmalıdır.

Bu zor. Seçenekler listesinin değiştirilmesinden sonra rotasyonun sağlam kalması ne anlama gelir? Sonuçta, listeyi tamamen yeniden inşa ediyor olabilirsiniz, bulunduğunuz yere ilişkin ipuçlarını yok edebilirsiniz.

Muhtemelen yapabileceğiniz, seçeneklerinizi temsil eden dosyalara sahip bir dizin oluşturmaktır (dosya adı veya içeriği yoluyla). Ardından, cron işi her yürütüldüğünde, dosyaları son değiştirme zamanına göre sıralayarak listelersiniz. En eski girdiyi alırsınız, touchdeğişiklik zamanını geçerli saate değiştirmek için bu dosyayı kullanırsınız, daha sonra komut dosyasını çalıştırmak için kullanırsınız.

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

İsterseniz, bunu cron için de tek bir satırda yazabilirsiniz, ancak okumak zorlaşacaktır.

Seçenek eklemek, seçenekler dizinine yeni dosyalar eklemek anlamına gelir. Seçenekleri kaldırmak, dosyaları silmek anlamına gelir. Herhangi bir noktada, en eski dosya sonraki çalıştırılacak dosyadır, bu nedenle yeni seçenekler, yeni çalıştırılmış gibi, döngünün sonuna eklenir. Seçenekleri yeniden sıralamak isterseniz, istediğiniz sırayla dokunabilirsiniz.


"Liste düzenlemeleri" nde seçenek sıralılığını yönetme şekliniz için + 1'leyin.
Hagen von Eitzen

Cevabınız için teşekkürler, beğendim ve kullanacağım. Listeye yenilerini eklediğimde dönüşün kesin sırası o kadar önemli değil. Önemli olan tek şey, hepsinin her hafta 1-2 hafta koşmasıdır, aynı günde iki değil.
Saif Bechan

2
$(ls -rt | head -n1)elbette yeni satırları içeren dosya adlarını bozacaktır, ancak bu amaçla muhtemelen sadece "bunu yapma" ile kurtulabilirsiniz.
cjm

20

Diyelim ki haftanın her günü için farklı bir seçenek istiyorsunuz. Yapabilirsin:

  1. Bunlar için ayrı bir cron işi yapın:

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

    vb...

  2. Var bashsizin için istediğiniz seçenekleri sunar:

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

    (İkincisini çalıştırmadım, bu yüzden biraz ayar gerektirebilir - ama genel fikir bu.)


2
Cevaplar için teşekkürler, ama dağınık olacağını düşünüyorum. Gerçekten bir yerde bir dizi tanımlamak gerekir, aksi takdirde işe yaramaz. echo option1Vb. İle çalışamıyorum çünkü seçeneklerim haftadan haftaya değişebilir. Bunu sadece Düğüm uygulamamda yapacağım ve hangisini benim db'de son çalıştırdığımı takip edeceğim.
Saif Bechan

13

Hayır, bunu yapmanın temiz bir yolunu düşünemiyorum. Tarihi kontrol eden ve düğüm uygulamanızı her gün gerekli seçeneklerle başlatan basit bir kabuk sarmalayıcı komut dosyası yazmanız yeterlidir.


+1 anahtarı 'temiz bir yol yok'.
Paolo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.