Shoutcast, su/sudo und PHP

Guin

Registered User
Mir stellt sich folgendes Problem:
Ich moechte den Shoutcastserver per Webinterface an und abschalten. Dazu habe ich mir ein PHP Skript erstellt, was seinen Dienst soweit auch erledigt. ABER.. PHP Skripte werden unter dem User des Webservers ausgefuehrt und wenn der Webserver neu startet, werden alle Prozesse des Webserverusers beendet. Davon ist der Shoutcastserver dann auch betroffen.


PHP:
exec("/SHOUTCAST/sc_serv /opt/shoutcast/conf >/dev/null &");
exec("ps u -u www-data | grep '/SHOUTCAST/sc_serv' | awk '{print $2}' 2>&1", $return);
$buffer=(int)$return[0];
So starte ich das Ganze momentan. In $buffer ist die PID des Shoutcast, die dann in einer Datei gespeichert wird (wird nicht unbedingt benoetigt).

Ich hatte mir gedacht, dass ich den ausfuerenden User mit su oder sudo auf WEBX aendere. Das klappt mit meinem jetzigen Wissenstand aber nicht, da ich nicht weiss, wie ich den Befehlen ein Passwort mitgeben kann.

Code:
sudo -u webX '/opt/shoutcast/sc_serv /opt/shoutcast/conf &'
sudo -p PASSWORT -u WEBX '/opt/shoutcast/sc_serv /opt/shoutcast/conf &'
So klappt es jedenfalls nicht so richtig.

Hat jemand mein Problem verstanden und kann mir helfen?

nochmal kurz:
- Wie verhindere ich, dass beim Webserverneustart die Prozesse von www-data beendet werden?
Und/Oder
- Wie wie gehe ich in PHP mit su und sudo um?
Und/Oder
- Ganz anderer Vorschlag. Ich wuerde aber gerne bei PHP bleiben.


PS: mir fiel einfach kein gescheiter Titel ein.
PPS: PHP laeuft, wie sicherlich schon vermutet, als Modul.
 
Danke fuer die Antwort.
Leider moechte das nicht so wie ich es will.

Ich habe noch etwas rumprobiert. Wenn ich mich in der Shell per su zu www-data mache und dann den Shoutcast starte, wird der Prozess beim Apacheneustart nicht beendet (egal ob mit oder ohne nohup).
Laeuft der Befehl ueber PHP, wird der Prozess beim Apacheneustart beendet.
PHP:
exec("nohup /SHOUTCAST/sc_serv /SHOUTCASTconfig.cnf >/dev/null &");

PS Auszug (ueber PHP gestartet)
Code:
www-data 24087  0.0  0.1 29248 1752 ?        S    16:47   0:00 /SHOUTCAST/sc_serv /SHOUTCAST/config.cnf
Nach dem Apacheneustart ist der Prozess weg.
 
sudo kann auch Befehle ohne Passworteingabe ausführen. Schau mal in die manpage dazu, da steht drin, wie's geht.

Aber vorsicht - man kann sich mit dem Ausführen von Befehlen under anderen UIDs ziemliche Sicherheitslücken in's System ballern.
 
Ohne Passwort duerfte sudo nichtfunktionieren.
Das Skript wird als www-data ausgefuehrt. Wenn ich da ein sudo mache, will er ein Passwort von mir.

Das Problem ist auch, dass er den Shoutcast Prozess beim Apacheneustart beendet, wenn der Prozess von PHP (www-data) aus gestartet wurde.
Starte ich den Shoutcast hingegen in der Konsole als www-data, dann wird der Shoutcast Prozess nicht beendet.

[edit] Hab's anders geloest. Danke
 
Last edited by a moderator:
Ach was lieb ich mein PHP-Telnet-Icecast Script da hab ich diese Probleme alle nicht :)

GEZ.: DJRick - ewiger Verfechter der Icecast Version 1.3.12....
 
Es gibt theoretisch mehrere Moeglichkeiten.
1. PHP als CGI laufen lassen... das ist wohl eher nicht geeignet.
2. Start/Stop Skript in Perl schreiben.
3. Screen verwenden.
4. Per Cron alle x Minuten pruefen, ob der Shoutcast laeufen soll.

Ich habe mich aus Bequemlichkeit fuer 4. entschieden.
Beim Starten wird ein Flag gesetzt und ein von Cron angestossenes Skript schaut dann nach, ob SC laeuft, wenn nicht, wird's gestartet.
 
@djrick
Könntest du mir vielleicht sagen wo ich das Script finde? :D

@Guin
Danke schön. Ich tendiere auch eher zu viertens, da meine Perl Kentnisse etwas eingerostet sind.
 
Sandmann said:
@djrick
Könntest du mir vielleicht sagen wo ich das Script finde? :D
Mhm...selbst geschrieben. Soweit ich weiß ist das einzigartig im Netz und noch nie wo anders gesehen. Und ausdiesen Grund: Gibts nicht. Ich stells nur Kunden zur Verfügung die auf meinem eigenen Server einen Stream haben
 
Isch weiß - isch brauch Socket :D

Ne, ist kein Problem für mich das selbst zu programmieren (ist ja schließlich mein Beruf), was ich bräuchte wäre eine Liste der Commands die man senden kann und ob es z.b ein spezielles Format ist, oder Plaintext. Weisst wie ich mein? :)
 
Immer bedenken ich rede von:
Icecast 1.3.xx nicht von der 2er Version!

Setz mal einen Icecast auf, Telnette dich drauf und geb "help" ein. Da haste alle Befehle die es gibt. Du brauchst eigentlich nur:

list
switch
quit
oper
 
Hmm,

okay. Erstmal danke.Was meinst, sind dir noch Möglichkeiten für die 2er bekannt?

Und noch ne andere Frage, was benutzt du als Streamclient? Kannst du da Software empfehlen? (Am besten mit Jingle, Mixfunktion usw.) Gerne auch kostenpflichtig oder/und auch mit Shoutcast.
 
Sandmann said:
Und noch ne andere Frage, was benutzt du als Streamclient? Kannst du da Software empfehlen? (Am besten mit Jingle, Mixfunktion usw.) Gerne auch kostenpflichtig oder/und auch mit Shoutcast.
Ich habe das mal relativ professionell gemacht, die besten Erfahrungen habe ich mit Jazler:
http://www.jazler.com/products/jazlerradio.asp

Die beste API bietet Radio Player Pro, wir hatten glücklicherweise jemanden im Team der an der Englishen Version mitarbeitete und somit konnten wir eigene erweiterungen schreiben und kamen auch recht günstig daran:
http://radiosoftpro.com/en/?rppro&main
 
gegen das Beenden der Prozesse beim Beenden des Apache kannst du dir mit dem atd helfen - ist zwar nicht besonders schon, aber es funktioniert.

Im PHP Script dann einfach dein Start-Shellscript an den atd übergeben:

Code:
<?php system ("echo $script_name | at now"); php?>

$script_name muss dazu natürlich ausführbar sein.
 
Code:
<?php system ("echo $script_name | at now"); php?>
Wuerde das aber nicht immer einen Fehler verursachen, wenn der Shoutcast schon laeuft?

[edit] Ah schon ok :)
Es wird ja nur ein Skript angestossen, mit welchen man dann den Shoutcast bei Bedarf starten kann.
 
Last edited by a moderator:
genau... und sonst piped man einfach die beidne Ausgabestreams nach /dev/null, und schon ist Ruhe :D
wenn man ein MAILTO='' vorne dran schreibt, dürfte das auch gehen.
 
Back
Top