Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Koodin suoritus kerran tunnissa

E1ss [11.08.2018 17:57:52]

#

Olen miettinyt että mitä kieltä minun kannattaisi käyttää serverillä (joka varmaan on linux pohjainen) kun haluan että se kerran tunnissa suorittaa tietyn koodin. Itse käytän paljon php:tä servereillä mutta sitten joutuisin jollain toisella laitteella hakea tätä tiedosta kerran tunnissa. Onko se hyvä idea että teen python koodin joka pyörii kokoajan while looppia. Sitten aina tasatunnein laitan python koodin hakemaan php koodia?

peran [11.08.2018 19:26:45]

#

crontab-auttaneen ?

Sen jälkeen ei ole niin väliä, millä kielellä teet scriptisi.

Siis jos vaatimuksena on, että serverillä tarvitsee ajaa scripti kerran tunnissa.

Metabolix [11.08.2018 19:43:31]

#

Nykyaikaisissa palvelimissa on valmiiksi välineet, joilla saa suoritettua komentoja ajastetusti. Linuxissa on systemd tai cron, ja Windowsissa on Tehtävien ajoitus -toiminto. Suoritettavan koodin taas voi kirjoittaa millä tahansa. Myös PHP:tä on mahdollista suorittaa PHP-tulkilla suoraan ilman HTTP-palvelinta, ja vaikka ei tätä osaisi, niin ainakaan ei ole mitään syytä hakea sivua toisella laitteella. Omaa skriptiä pysyvään ajastukseen ei kannata tehdä, koska edelleen se oma skripti pitäisi jotenkin automaattisesti käynnistää, jolloin samalla vaivalla voi tehdä kunnolla sen ajastuksen.

Jos käytössä on systemd, tarvitaan ajastintiedosto ja palvelutiedosto. Esimerkiksi seuraava ajastin käynnistyy minuutin päästä koneen käynnistyksestä ja sen jälkeen aina 12 minuuttia 37 sekuntia tasatunnin jälkeen, ja ajastettu palvelu on PHP-skriptin suoritus.

# /etc/systemd/system/oma-tehtava.timer
[Unit]
Description=Oman tehtävän kuvaus

[Timer]
OnBootSec=1min
OnCalendar=*:12:37/1:00:00
AccuracySec=10s

[Install]
WantedBy=multi-user.target
# /etc/systemd/system/oma-tehtava.service
[Unit]
Description=Oman tehtävän kuvaus

[Service]
Type=oneshot
ExecStart=/usr/bin/php /jokin/polku/php-skriptiin.php
# Tai: ExecStart=/usr/bin/curl -s -o /dev/null -k https://example.com/skripti.php
User=suorittava-käyttäjänimi
Group=suorittavan-käyttäjän-ryhmä

Ajastin asennetaan ja käynnistetään näin:

sudo systemctl enable --now oma-tehtava.timer

Jos ajastus kuuluu tietylle käyttäjälle, sen voi tehdä myös käyttäjän omaan systemd-instanssiin polkuun ~/.config/systemd/user/, jolloin Install-osioon tulee default.target, käynnistyskomento pitää antaa käyttäjäkohtaiselle systemd:lle ja käyttäjän oma systemd pitää asettaa pysymään käynnissä käyttäjän läsnäolosta riippumatta.

sudo loginctl enable-linger käyttäjänimi
systemctl --user enable --now oma-tehtava.timer

Toisaalta jos tarkoitus on vain väliaikaisesti suorittaa koodi noin tunnin välein, Linuxissa helpointa on käyttää komentoriviä tähän tapaan:

while sleep 1h; do php koodi.php & done

Toiston voi lopettaa näppäinyhdistelmällä Ctrl-C.

E1ss [11.08.2018 20:02:15]

#

Kiitos vastauksista. Ongelma ratkaistu.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta