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?
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.
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.
Kiitos vastauksista. Ongelma ratkaistu.
Aihe on jo aika vanha, joten et voi enää vastata siihen.