mboost-dp1
nohup og stderr
- Forside
- ⟨
- Forum
- ⟨
- Support
Hej! Jeg er relativ ny til linux styresystemet og har et lille problem..
Jeg har skrevet et PHP CLI script som gerne skulle køre hele tiden, også selv om jeg logger af terminalen.. Det kan jeg jo bruge nohup kommandoen til.. so far so good.
Men mit problem er at mit script ser ud til at stoppe, og jeg har lidt svært ved at se hvorfor, da nohup kun sender stdout til nohup.out filen og redirecter stderr til stdout (Så man får eventuelle fejlbeskeder i terminalen og ikke i ens out fil)..
Så mit spørgsmål er:
Er der en måde hvorpå jeg kan fange både stdout og stderr i nohup.out filen?
pt bruger jeg noget ala:
nohup php cli-script.php > script.log&
Jeg har skrevet et PHP CLI script som gerne skulle køre hele tiden, også selv om jeg logger af terminalen.. Det kan jeg jo bruge nohup kommandoen til.. so far so good.
Men mit problem er at mit script ser ud til at stoppe, og jeg har lidt svært ved at se hvorfor, da nohup kun sender stdout til nohup.out filen og redirecter stderr til stdout (Så man får eventuelle fejlbeskeder i terminalen og ikke i ens out fil)..
Så mit spørgsmål er:
Er der en måde hvorpå jeg kan fange både stdout og stderr i nohup.out filen?
pt bruger jeg noget ala:
nohup php cli-script.php > script.log&
#1
Hvad er det du proever at opnaa?
cron(tab) plejer at vaere vejen frem hvis der er noget du vil koere periodisk.
Hvis du vil have noget til at koere konstant (lad os sige overvaagning), kan du evt. koere det i en screen.
nohup er, imo, ikke at foretraekke, da det goer dit program immunt til hangup fra cli. Dvs du skal kill -9 den istedetfor bare at bede programmet stoppe (HUP).
Hvorfor ikke bruge screen eller koere det som en daemon?
Alternativt kan du vel bare koere dit script med &, saa skulle den gerne forke anyway.
Hvis du bruger PHP burde du bruge den error logging til at pege alt ned i cli-script.log istedetfor stdout.
[add]
Google siger, ioevrigt, at nohup binder sig til din terminal, saa naar du logger ud lukkes det ned, ligesom alt andet din terminal koerer. Screen ser ud til at vaere vejen frem for folk der gerne vil bruge nohup :)
Hvad er det du proever at opnaa?
cron(tab) plejer at vaere vejen frem hvis der er noget du vil koere periodisk.
Hvis du vil have noget til at koere konstant (lad os sige overvaagning), kan du evt. koere det i en screen.
nohup er, imo, ikke at foretraekke, da det goer dit program immunt til hangup fra cli. Dvs du skal kill -9 den istedetfor bare at bede programmet stoppe (HUP).
Hvorfor ikke bruge screen eller koere det som en daemon?
Alternativt kan du vel bare koere dit script med &, saa skulle den gerne forke anyway.
Hvis du bruger PHP burde du bruge den error logging til at pege alt ned i cli-script.log istedetfor stdout.
[add]
Google siger, ioevrigt, at nohup binder sig til din terminal, saa naar du logger ud lukkes det ned, ligesom alt andet din terminal koerer. Screen ser ud til at vaere vejen frem for folk der gerne vil bruge nohup :)
#2 - Det er en simpel socket server, så at køre den som et cronjob er ikke et alternativ...
Jeg kunne jo eventuelt køre den via screen, men hvad så hvis programmet lukker uventet? lukker min screen så ikke også? (Sorry er som sagt en linux noob)
Må du gerne uddybe? Kan jeg via PHP pege stderr til en fil eller hvad?
Jeg kunne jo eventuelt køre den via screen, men hvad så hvis programmet lukker uventet? lukker min screen så ikke også? (Sorry er som sagt en linux noob)
Hvis du bruger PHP burde du bruge den error logging til at pege alt ned i cli-script.log istedetfor stdout.
Må du gerne uddybe? Kan jeg via PHP pege stderr til en fil eller hvad?
#3
Nej, din screen er bare en "hosted" terminal som du kan kalde.
Dvs du skriver bare:
Du kan, i PHP, angive hvilken fil fejl skal logges til.
http://php.net/manual/en/function.error-log.php
Alternativt kan du kigge i /etc/php/[php.ini] (ved ikke lige hvor praecis den ligger i dit system).
Der skulle gerne vaere noget info om hvor php logger til.
Default er vistnok syslog, men kig deri.
Typisk vil alle logs i dit linux system vaere at finde i /var/log/ :)
Jeg kunne jo eventuelt køre den via screen, men hvad så hvis programmet lukker uventet? lukker min screen så ikke også? (Sorry er som sagt en linux noob)
Nej, din screen er bare en "hosted" terminal som du kan kalde.
Dvs du skriver bare:
screen -S phpcli
php5 cli-script.php
Må du gerne uddybe? Kan jeg via PHP pege stderr til en fil eller hvad?
Du kan, i PHP, angive hvilken fil fejl skal logges til.
http://php.net/manual/en/function.error-log.php
Alternativt kan du kigge i /etc/php/[php.ini] (ved ikke lige hvor praecis den ligger i dit system).
Der skulle gerne vaere noget info om hvor php logger til.
Default er vistnok syslog, men kig deri.
Typisk vil alle logs i dit linux system vaere at finde i /var/log/ :)
Takker for alle svarene! Det er sku lækkert at have sådan nogle eggheads man kan mooche viden af :-)
Kører den via screen nu, så må vi se hvad den siger af fejl :-)
Kører den via screen nu, så må vi se hvad den siger af fejl :-)
Der er også muligheden for reelt at lade den forke til bagrunden, så det bliver en daemon.
Tror jeg har noget eksempel kode liggende. Bruger det selv på en af vores servere, der har jeg så et cron-job kørende som tjekker om skidtet stadig er i live, og ellers sørger for at starte det igen.
Tror jeg har noget eksempel kode liggende. Bruger det selv på en af vores servere, der har jeg så et cron-job kørende som tjekker om skidtet stadig er i live, og ellers sørger for at starte det igen.
Hvis jeg vil køre et program og gemme output bruger jeg et script der ser sådan her ud:reefermadness (1) skrev:Er der en måde hvorpå jeg kan fange både stdout og stderr i nohup.out filen?
#!/bin/bash
exec >>"$1" 2>&1
shift
printf "%s: %s\n" "$(date)" "$*"
exec "$@"
Hvis jeg kalder scriptet for log, så kan jeg køre det sådan her:
log /var/local/log/bla kommando
Hvis jeg gerne vil køre et program, som automatisk bliver genstartet hvis det går ned eller afslutter, så bruger jeg et script der ser sådan her ud:
#!/bin/bash
LAST_TIME=0
SLEEP_TIME=0
while true
do
printf "%s: Running %s\n" "$(date)" "$*"
"$@"
THIS_TIME=$(date +%s)
DELTA=$[ $THIS_TIME - $LAST_TIME ]
LAST_TIME=$THIS_TIME
if [ $DELTA -lt 10 ]
then
SLEEP_TIME=$[$SLEEP_TIME + 1]
else
SLEEP_TIME=$[$SLEEP_TIME - $DELTA/5]
fi
if [ $SLEEP_TIME -gt 0 ]
then
echo "$(date): Sleeping for $SLEEP_TIME seconds"
sleep $SLEEP_TIME
else
SLEEP_TIME=0
fi
done
Hvis jeg kalder dette script for loop, så kan jeg køre det sådan her:
loop kommando
Hvis jeg vil køre et program i baggrunden helt uden forbindelse til terminalen, så bruger jeg et c program, der ser sådan her ud:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
int main(int argc, char ** argv)
{
char eflag;
int pipefd[2];
if (argc<2) {
fprintf(stderr,"Usage: %s <cmd>\n",argv[0]);
return EXIT_FAILURE;
}
if (pipe(pipefd)) {
perror("pipe");
return EXIT_FAILURE;
}
switch(fork()) {
case -1:
perror("fork");
return EXIT_FAILURE;
case 0:
close(pipefd[0]);
if (daemon(1,0)) {
write(pipefd[1],"e",1);
write(pipefd[1],&errno,sizeof(errno));
return EXIT_FAILURE;
}
write(pipefd[1],"",1);
fcntl(pipefd[1],F_SETFD,FD_CLOEXEC);
execvp(argv[1],argv+1);
write(pipefd[1],&errno,sizeof(errno));
return EXIT_FAILURE;
}
close(pipefd[1]);
if(read(pipefd[0],&eflag,1)!=1) {
perror("read");
return EXIT_FAILURE;
}
switch(read(pipefd[0],&errno,sizeof(errno))) {
case 0:
if (!eflag) return EXIT_SUCCESS;
default:
fprintf(stderr,"%s: Internal error!\n",argv[0]);
return EXIT_FAILURE;
case sizeof(errno):
perror(eflag?"daemon":argv[1]);
return EXIT_FAILURE;
}
}
Hvis jeg kalder dette program for run, så kan jeg køre det sådan her:
run kommando
Og hvis jeg vil kombinere alle tre, så kan jeg køre:
run log /var/local/log/bla loop kommando
Man kan naturligvis også kombinere de enkelte med f.eks. nohup, script eller screen.
Det afhænger af hvordan du starter programmet.reefermadness (3) skrev:Jeg kunne jo eventuelt køre den via screen, men hvad så hvis programmet lukker uventet? lukker min screen så ikke også?
Hvis du giver programmet som argument til screen, så vil screen ganske rigtigt lukke ned hvis programmet afsluttes (normalt eller pga. en fejl). Men hvis du starter screen manuelt og indtaster kommandoen i en shell, så vil screen blot returnere til den shell, hvis programmet afsluttes.
Hvis det er et program der skal startes automatisk hvis computeren har været genstartet (f.eks. ved et strømsvigt), så skal man være overordentligt omhyggelig med hvordan det startes. Man kan nemt risikere at begå en fejl så det ikke startes, eller man ligefrem laver en fejl så maskinen ikke kan boote af sig selv. Det er specielt problematisk, hvis man ikke har fysisk adgang til maskinen, når man opdager problemet.
Hvis man endeligt får det lavet, så det starter helt af sig selv når computeren starter op, og automatisk genstartes, hvis programmet går ned, så har man sandsynligvis et nyt problem. Man vil glemme alt om det, og når man så endelig har fået sig gjort afhængig af at have det kørende, så opstår der en fejl som man ikke har haft før, og man opdager måske ikke i tide, at der er en fejl.
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.