WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   php shell_exec och broken pipe (https://www.wn.se/forum/showthread.php?t=1043096)

azzid 2010-07-29 08:59

php shell_exec och broken pipe
 
Jag fick nyss i uppgift att styra upp ett problem med en webbserver. Jag tittade på det men blev inte vidare klok på problemet, varför jag vänder mig hit för att se om någon annan kanske känner igen det.

php-koden ska bara sammanställa och presentera lite siffror, dessa siffror hittas i diverse loggfiler och för att saxa loss rätt bit ur resp. loggfil används små bashscript.

En rad i php-koden ser alltså typiskt ut såhär (|awk finns där för att städa bort decimaler):
Kod:

$var = trim(shell_exec("script.sh current | gawk -F. '{print $1}'"));
och en rad i skalscriptet ser typiskt ut såhär:
Kod:

VAR=$(cat /var/log/file.log | grep $DATE | head -n1 | awk -F, {'print $3'})
Om jag kör skalscriptet från skalet så fungerar det finfint, oavsett om jag kör som root eller om jag kör som webbserverns användare, men så fort jag laddar phpkoden i en webbläsare dyker detta upp i errorloggen för apache:
Kod:

grep: writing output: Broken pipe
Genom att klippa ned koden till ett minimum har jag lyckats slå fast att det är just den första pipen i skalscriptet som genererar felet i loggen, ändrar jag t.ex. så jag pipar till något annat så får jag samma fel, fast gällande det andra kommandot (grep byts till cat t.ex.).

Någon som känner igen problemet? Eller har någon idé om hur man ska få ordning på det?

abergman 2010-07-29 09:41

Citat:

Ursprungligen postat av azzid (Inlägg 20363791)
Jag fick nyss i uppgift att styra upp ett problem med en webbserver. Jag tittade på det men blev inte vidare klok på problemet, varför jag vänder mig hit för att se om någon annan kanske känner igen det.

php-koden ska bara sammanställa och presentera lite siffror, dessa siffror hittas i diverse loggfiler och för att saxa loss rätt bit ur resp. loggfil används små bashscript.

En rad i php-koden ser alltså typiskt ut såhär (|awk finns där för att städa bort decimaler):
Kod:

$var = trim(shell_exec("script.sh current | gawk -F. '{print $1}'"));
och en rad i skalscriptet ser typiskt ut såhär:
Kod:

VAR=$(cat /var/log/file.log | grep $DATE | head -n1 | awk -F, {'print $3'})
Om jag kör skalscriptet från skalet så fungerar det finfint, oavsett om jag kör som root eller om jag kör som webbserverns användare, men så fort jag laddar phpkoden i en webbläsare dyker detta upp i errorloggen för apache:
Kod:

grep: writing output: Broken pipe
Genom att klippa ned koden till ett minimum har jag lyckats slå fast att det är just den första pipen i skalscriptet som genererar felet i loggen, ändrar jag t.ex. så jag pipar till något annat så får jag samma fel, fast gällande det andra kommandot (grep byts till cat t.ex.).

Någon som känner igen problemet? Eller har någon idé om hur man ska få ordning på det?

Om du byter ut variablerna mot riktiga värden, vad får du då?

azzid 2010-07-29 16:47

Det är så rörigt på servern/i loggen just nu att det blir svårt att göra några vettiga tester. Men när jag försökt återskapa problemet med färdiga strängar istället för variabler så misslyckas jag. Kunde tom skapa en textfil och köra exakt samma kod, men då få den att fungera, så jag misstänker att det är nått tjall med loggfilerna som datat hämtas ur.

Svårt som sagt att komma vidare när testerna blir otydliga pga övermatade loggar, så lösningen kan nog få vänta en stund till.

Tack för svaret!

Jonas 2010-07-31 01:18

Citat:

Ursprungligen postat av azzid (Inlägg 20363791)
Kod:

$var = trim(shell_exec("script.sh current | gawk -F. '{print $1}'"));

Finns variabeln $1 i PHP?

Testa annars:
PHP-kod:

$var trim(shell_exec('script.sh current | gawk -F. \'{print $1}\'')); 


martine 2010-08-05 13:46

Citat:

Ursprungligen postat av Jonas (Inlägg 20364010)
Finns variabeln $1 i PHP?

Testa annars:
PHP-kod:

$var trim(shell_exec('script.sh current | gawk -F. \'{print $1}\'')); 


Jodå, $1 finns allt i php men inte i samma sammanhang som i shellet. Skarp iaktagelse. ;-)

Jonas 2010-08-07 01:37

Citat:

Ursprungligen postat av martine (Inlägg 20364516)
Jodå, $1 finns allt i php men inte i samma sammanhang som i shellet. Skarp iaktagelse. ;-)

Alltså, har variabeln $1 något värde.

Jine 2010-08-15 06:31

$1 är inte en giltig variabel i PHP vad jag vet, då variabler alltid måste börja med en bokstav?

Jonas 2010-08-15 13:27

Citat:

Ursprungligen postat av Jine (Inlägg 20365547)
$1 är inte en giltig variabel i PHP vad jag vet, då variabler alltid måste börja med en bokstav?

Precis? Därför försöker PHP interpretera variabeln och genererar ett felmeddelande.

En möjlig orsak till problemet.

Dock återkopplar trådskaparen inte.

terbon 2010-08-16 23:56

Men eftersom du har " så kommer ju php försöka skriva ut variabeln $1 i linjen, och det är ingen giltig variabel i php.

Pröva att köra med ' istället.
PHP-kod:

$var trim(shell_exec('script.sh current | gawk -F. \'{print $1}\'')); 


--
Jag var bra på att repetera de som de tidigare skrivit, note to self: läs igenom de andra kommentarerna riktigt.


Alla tider är GMT +2. Klockan är nu 23:08.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson