it-swarm-eu.dev

Skript neběží přes crontab, ale funguje dobře samostatně

Mám skript, který mi připomíná restart počítače, pokud uptime je více než, řekněme 3 dny (ačkoli je nastavena na 0 dní, nyní jen zkontroluji, zda je skript spuštěn, protože můj počítač byl pouze přes den..).

Uvědomuji si, že nejde o nejelegantnější scénář, ale snažím se! :)

#!/bin/bash

up=$(uptime | grep "day" > /home/username/uptime.foo && awk < /home/username/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"

Udělal jsem to spustitelným uživatelem chmod + x checkup.sh a funguje to dobře, když to spustím z terminálu přes ./checkup.sh

Moje položka crontab pro tento skript je:

46 14 * * * /home/username/Desktop/./checkup.sh

Takže to běží ve 14: 46h denně ...

Takže ... myslím, že by to mělo běžet, pokud jsem neudělal něco opravdu hloupého. Také si myslíte, že je v pořádku přesunout tento bash skript na /bin?

55
dearN

Hezky po pořadě:

Nejprve vám dáme uživatelskou složku s binem:

cd ~/ && mkdir bin

Chcete použít crontab. Začněme něčím opravdu jednoduchým:

* * * * * touch /tmp/testing.txt

Dobře, takže to funguje

Nyní zkuste spustit skript, který dělá to samé

* * * * * /home/username/bin/touchtest.sh

běžet jednou za minutu, dokud to nezačne fungovat
Ne, nepotřebujete ./ uprostřed řádku. ./ je pro případy, kdy dáváte relativní adresy URL.
Dobře, tak to funguje

Nyní zkuste spustit skript, který volá xmessage

* * * * * /home/username/bin/rebootwarn.sh

nejde to

Nejprve musíme být nezávislí na proměnných prostředí. To zahrnuje nastavení cesty, nastavení x11 nebo cokoli jiného (na mysli se objeví python a Ruby ...)

Nechte nás vypadat trochu jako správný cronový soubor anacronu. Uložil jsem to jako test

#Borrowed from anacron
Shell=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron

* * * * *   /bin/bash /home/username/bin/test.sh

Nastavit na spuštění jednou za minutu

crontab test importovat

Na skript

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DISPLAY=:0.0
up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"`

Dobře, takže to funguje ... co jsme udělali?
Změnili jsme všechny příkazy tak, aby nebyly závislé na cestách, které jsme explicitně nenastavili
Spustili jsme náš skript výslovně s bash
Řekli jsme skriptu, že očekáváme, že bude na DISPLEJI: 0.0

72
RobotHumans

Problém byl vyřešen přečtěte si příručku v Google:

popis:

  1. Mám skript pomocí #!/bin/bash jako záhlaví
  2. Dal jsem skript na /home/wc3/palert/

analýza:

  1. crontab nemůže spustit můj skript
  2. Ale pokud spustím ručně, zobrazí se výstup a také vidím výsledek na mém webu
  3. To znamená, že crontab nemůže dostat prostředí, jako když spustíte skript ve složce skriptu

odpovědět:

  1. vložte své prostředí pomocí následujícího řádku do skriptu pomocí:

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/wc3/palert
    

    změnit toto: /home/wc3/palert
    s: místo, kam jste vložili skript, např. /home/budi/script.sh

vzorek:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/budi
# Script continues...

Zkuste skript umístit na crontab.

11
budi satriyo

V mém případě bylo vše způsobeno tím, že na prvním místě není načten profil. Stačí použít -l nebo --login. Jako tak @reboot bash -l /path/to/scirpt.sh >> /tmp/some.log

0
Vadim