2017-10-01 1 views
0

Kann mir bitte jemand sagen, wenn ich "Meta-Refresh" wie unten, wird das auch wieder laufen bash program-run-tmp-directory3.sh &> stdout.out &? ODER, nur der Browser wird aktualisiert, wobei am Leben erhalten bleibt?Meta-Refresh (nur Browser aktualisieren)

"pid" ist die "Prozess-ID" des Programms im Hintergrund ausgeführt.

Wenn dieser Code weiter unten auch das Programm bash program-run-tmp-directory3.sh &> stdout.out & ausführt. Bitte lassen Sie mich wissen, wie ich es vermeiden kann?

#!/bin/sh 
echo "Content-type: text/html" 
echo "" 
bash program-run-tmp-directory3.sh &> stdout.out & 
pid=$! 

if [[ `ps -p $pid | wc -l` -gt 1 ]] 
then 
    output="Program is running. Running time depends on the number of alternatively spliced proteins the submitted gene has. Results will be displayed here." 
    echo "<html>" 
    echo "<head>" 
    echo "<meta http-equiv=\"refresh\" content=\"10\"/>" 
    echo "</head>" 
    echo "<body>" 
    echo "<table width=\"750\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">" 
    echo "<tr><td><img src=\"../../images/calc.gif\" align=\"absmiddle\"> <strong> $output </strong></td></tr>" 
    echo "</table>" 
    echo "</body>" 
    echo "</html>" 
fi 

Danke.

+0

Bitte mehr Anstrengungen bei der Formatierung Code in Frage gestellt. Sie benötigen vier Leerzeichen vor Codezeilen, nicht ein Dutzend davon. –

+0

Ich nehme an, dass Sie Ihren Server so konfiguriert haben, dass er dieses Skript ausführt, wenn er eine Anfrage für eine bestimmte URL erhält. In diesem Fall wird das Skript bei jeder Anforderung einer URL erneut ausgeführt (einschließlich des eingebetteten Aufrufs von 'bash'). Ihre Meta-Aktualisierung fordert den Browser auf, die Seite alle 10 Sekunden erneut abzurufen. Wenn der Browser dies erfordert, werden Sie 'bash' bitten,' program-run-tmp-directory3.sh' alle 10 Sekunden auszuführen. –

Antwort

0

An dieser Stelle scheint es Ihre Frage ist, wie in einem Bash-Skript zu erkennen ist, dass ein anderes Skript läuft und es nicht erneut zu starten. Eine schnelle und schmutzige Methode, die oft gut genug ist, ist grep die Ausgabe von ps für die Befehlszeile Ihres Skripts. Dies wird durch die Tatsache erschwert, dass es abhängig von den Optionen, die Sie für ps verwenden, auch die Prozess-Befehlszeile grep anzeigt, die offensichtlich auch die Befehlszeile des Skripts als Teil des grep Musters enthält. Eine von vielen Möglichkeiten, dies zu beheben, ist here. All diese Erklärung ist länger als das eigentliche Skript.

Noch ein Hinweis. wollen nur sicherstellen, dass Sie verstehen, was die bash$! Mittel konstruieren:

($!) Expands to the process ID of the job most recently placed into 
the background, whether executed as an asynchronous command or using 
the bg builtin (see Job Control Builtins). 

Also nur, das wird die Dinge verweisen, dass die aktuellen Ausführung Ihres CGI-Skript kennt. Wenn Ihr Browser sich entscheidet, erneut zu aktualisieren, sendet dies einen weiteren HTTP-GET an Ihren Server, der wiederum Ihr CGI-Skript hervorbringt, wobei sich $! nur auf den Job bezieht, der zuletzt von dieser Instanz Ihres Skripts erzeugt wurde.

Wenn ich anschaue, was Sie versuchen, zu tun, wollen Sie vielleicht so etwas wie dieses (nicht getestet):

#!/bin/sh 
echo "Content-type: text/html" 
echo "" 
# if other script not already running 
if ! ps aux | grep "[b]ash.*program-run-tmp-directory3.sh" 
    then 
    bash program-run-tmp-directory3.sh &> stdout.out & 
    # I'm superstitious; let's give it a moment to start 
    sleep 1 
    fi 

if ps aux | grep "[b]ash.*program-run-tmp-directory3.sh" 
then 
    output="Program is running. Running time depends on the number of alternatively spliced proteins the submitted gene has. Results will be displayed here." 
    echo "<html>" 
    echo "<head>" 
    echo "<meta http-equiv=\"refresh\" content=\"10\"/>" 
    echo "</head>" 
    echo "<body>" 
    echo "<table width=\"750\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">" 
    echo "<tr><td><img src=\"../../images/calc.gif\" align=\"absmiddle\"> <strong> $output </strong></td></tr>" 
    echo "</table>" 
    echo "</body>" 
    echo "</html>" 
else 
    : # ... some useful error output composed as HTML 
fi 
Verwandte Themen