03. august 2004 - 10:04Der er
33 kommentarer og 3 løsninger
php sciprt kørt som cronjob?
Hvordan få jeg kørt et phpsciprt som et cronjob?
jeg har forsøgt at skive nedenstående, som er det der står i manualen til det backupsciprt jeg forsøger at få kørt, men det virker ikke, sciptet bliver ikke kørt?!
fsconsult: Til et backup system, der kan tage lang tid at køre færdigt, er det mere velegnet at bruge cli udgaven af php. Ellers skal man bl.a. til at rode med diverse timeouts, for ikke at tale om sikkerhed så folk udefra ikke kan køre det.
Men behøver det nødvendigvis at være et php script?
hmm.. > /dev/null burde ikke påvirke hvordan det kører. Det gør bare at (næsten) alt hvad der normalt bliver skrevet på skærmen bliver ignoreret (sendt til /dev/null). Så slipper du for en mail fra cron hver gang scriptet kører med lidt ligegyldigt tekst.
Til backup af mysql kunne du bruge mysqldump. Et simpelt lille shell script på et par linier kan nok klare det :) Skal det bare tage en komplet backup af alt?
# Til en fil (backup.sql) mysqldump --all-databases --password=noget > backup.sql
# Eller til en anden server (kræver ssh med hostkeys for at undgå password) mysqldump --all-databases --password=noget | ssh bruger@backup-server 'cat > backup.sql'
# Der er sikkert en smartere løsning end at skrive mysql passwordet lige der # hvor folk kan bruge ps til at opsnappe det..
#!/bin/sh # # Backup of /home/site # # This script takes simple .zip backup of all MySQL databases. # EXPORTNAME=dbbackup.zip USER_GROUP="myuser.mygroup" CONFFILE=/etc/local/sitebackup.cnf
DBASES=$(echo "show databases;" | /usr/bin/mysql --defaults-extra-file=$CONFFILE | grep -v Database) if [ -z "$DBASES" ]; then echo No databases available exit 0 fi DIRNAME=dbbackup-$(date "+%Y%m%d") mkdir -p $PATHNAME/$DIRNAME cd $PATHNAME/$DIRNAME
#echo Data: $DBASES for i in $DBASES; do /usr/bin/mysqldump --defaults-extra-file=$CONFFILE --opt $i > ${i}_db.sql done cd ..
Jeg har forsøgt med nedenstående, og det virker tildels. backupfilen bliver lavet på source maskinen, men når den bliver uploaded på target maskinen er den tom. Scriptet spørger også efter passwordet til target maskinen som jeg må indtaste manuelt, og det er jo ikke optimalt når det skal køre som cron job
Passwordet kan du undgå vha hostkeys. Prøver lige om jeg kan huske det.. :)
Du opretter et sæt private og public keys vha: ssh-keygen -t rsa Når den spørger efter et password, trykker du bare enter (intet password)
Herefter skal den uploades til serveren. Til det plejer jeg at bruge (tilpasset til din user@host): cat ~/.ssh/id_rsa.pub|ssh backup@192.168.3.3 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' Det skulle så gerne være sidste gang du behøver password når du logger ind på den maskine via ssh :)
Iøvrigt har jeg også hørt rygter om at passwords til ssh kan sniffes, og hostkeys derfor er sikrere. Det password man kan indtaste til en hostkey bruges til at (de-)kryptere hostkey'en, og sendes derved ikke over netværket. ~/.ssh/id_rsa.pub (public) kan lægges på alle de maskiner hvor du gerne vil benytte det sæt hostkeys. ~/.ssh/id_rsa er derimod den private del, som du skal passe på at andre ikke får fingre i.
Hov, spottede lige fejlen i den linie du kører. En "> backup.sql" for meget: mysqldump --all-databases --password=noget| ssh backup@192.168.3.3 'cat > backupd.sql'
nu har vi efterhånden langt overskredet det grænse hvor jeg fatter ret meget af hvad der foregår.
Jeg har kørt ssh-keygen -t rsa (fra source maskinen) det gav dette output
Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 7a:93:b9:c4:08:4d:e5:b7:ae:9c:b6:a2:ab:88:f0:80 root@www.xxx.dk
ok jeg havde ikke set: <Hov, spottede lige fejlen i den linie du kører. En "> backup.sql" for meget: mysqldump --all-databases --password=noget| ssh backup@192.168.3.3 'cat > backupd.sql'
Nu er filen ikke længere tom, men stadig bliver jeg spurgt efter password
Iøvrigt står der noget i manualen til ssh om at man skal bruge -n for at ssh kan køre i baggrunden. Dvs, hvis du får problemer med at der ikke bliver taget backup fra cron jobbet, så kan du prøve at ændre det til mysqldump --all-databases --password=noget| ssh -n backup@192.168.3.3 'cat > backupd.sql
Det er noget med hvad ssh accepterer som standard input. Dvs når man kører det i en normal terminal, fungerer det fint, men ligeså snart man kører det i baggrunden fungerer det ikke. Jeg ved så ikke hvordan det er når man bruger ssh til at overføre data på den måde, så brug kun -n hvis det ikke virker ellers.
Jeg har store problemer med at få det til at virker. Det virker fint nok, når jeg køre det manuelt, men som cron job sker der ingen ting - jeg ved ikke rigtigt hvor jeg skal fejlsøge?!
Jeg har lavet en fil mysqlback.sh der ser sådan ud(og jeg har prøvet både med og uden -n: #!/bin/sh mysqldump --all-databases --password=noget | ssh backup@192.168.3.3 'cat > mysqlbackup.sql'
så har jeg lavet en domysqlback.job fil med følgende indehold: 18 13 * * * /etc/mysqlback.sh
og til sidst har jeg skrevet crontab domysqlback.job
Hvor skal jeg lede efter fejlen?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.