Salut à tous !

J'ai beau essayer d'avoir de l'aide sur d'autres forums, ça n'avance pas trop alors tous mes espoirs sont portés sur vous !

Pour faire court, j'ai des serveurs de jeux sur un dédié sous Debian 7, lorsqu'ils se lancent ils écrivent leur PID dans un fichier server.pid. Des fois ces serveurs freezent ou leur PID change (auto reload je pense) du coup quand je veux les stopper via l'API du jeu en PHP ça ne marche pas.

J'ai voulu créer un script, exécuté par PHP, pour les redémarrer peu importe s'ils fonctionnent normalement, s'ils freezent ou si leur PID change.

Problème : Pour trouver leur nouveau PID, j'utilise la commande lsof avec le port du serveur, mais depuis PHP celle ci n'est pas exécutée. Alors que via shell ça fonctionne très bien.

- Quand je rajoute sudo dans le exec de PHP j'ai cette erreur : sudo: no tty present and no askpass program specified
- Quand je rajoute dans etc/sudoers ces lignes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
www-data ALL=(ALL) NOPASSWD: SERVRES
Cmnd_Alias SERVRES = /***/***/***/server.sh
ça ne change rien. Même quand je fais www-data ALL=(ALL) NOPASSWD: ALL, il s'en bas les c*******.

Le script (oui c'est sans doute pas très bien codé c'est mon premier script) ::

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/bin/bash
 
#Author : Simon B. alias Themiller
 
#============= INFOS =============
 
PORT_NUMBER="$2"
NAME="$1"
LOGS=/home/www/sites/clients/client1/web3/web/servers/$NAME/output.txt
PIDFILE=/home/www/sites/clients/client1/web3/web/servers/$NAME/server.pid
SDEDI=/home/www/sites/clients/client1/web3/web/servers/$NAME/server
 
#============= FUNCTIONS =============
 
function test_port() {
 
	if  /usr/bin/lsof -Pi :${PORT_NUMBER} -sTCP:LISTEN -t >/dev/null ; then
    	PID="$(/usr/bin/lsof -Pi :${PORT_NUMBER} -sTCP:LISTEN -t)"
    	return 0
	else
	    return 1
	fi
 
}
 
function my_date {
  date "+%d/%m/%y %H:%M:%S"
}
 
#============= SCRIPT =============
 
# DEMARRAGE DU SERVEUR
 
case "$3" in
  start)
 
	if test_port; then
 
		echo "[$(my_date)] Server already online." >> ${LOGS}
		echo "Error : Server already online."
 
	else
		echo "[$(my_date)] Starting Server: "$NAME >> ${LOGS}
		echo "Starting your server."
		$SDEDI start
        echo "[$(my_date)] Server started: "$NAME >> ${LOGS}
        echo "Server started succefully !"
	fi
 
	;;
 
# ARRET DU SERVEUR	
 
  stop)
 
		echo "Stopping Server..."
		echo "[$(my_date)] Stopping Server..." >> ${LOGS}
 
        # ON KILL VIA LE FICHIER PID
 
		echo "Killing daemon with PID..."
		echo "[$(my_date)] Killing daemon with PID..." >> ${LOGS}
        kill `cat $PIDFILE`
        rm $PIDFILE
 
  		if test_port; then
 
			kill -9 ${PID}
			sleep 2
 
			if test_port; then
 
			    echo "[$(my_date)] ERROR !!!"
 
			else
				echo "Server stopped !"
				echo "[$(my_date)] Process killed to stop server." >> ${LOGS}
			fi
 
		else
			echo "Server stopped !"
			echo "[$(my_date)] Server stopped." >> ${LOGS}
		fi
 
	;;
 
# REDEMARRAGE
 
  restart)
 
  	if test_port; then
 
  		echo "Restarting Server..."
		echo "[$(my_date)] Restarting Server..." >> ${LOGS}
 
		# ON KILL VIA LE FICHIER PID
 
        echo "Killing daemon with PID..."
        echo "[$(my_date)] Killing daemon with PID..." >> ${LOGS}
        kill `cat $PIDFILE`
        rm $PIDFILE
 
  		if test_port; then
 
			kill -9 ${PID}
			sleep 2
 
			if test_port; then
 
			    echo "[$(my_date)] ERROR !!!" >> ${LOGS}
 
			else
				echo "[$(my_date)] Process killed !" >> ${LOGS}
			    sleep 5
			    $SDEDI start
			    sleep 5
			    echo "Server restarted !"
			    echo "[$(my_date)] Server restarted." >> ${LOGS}
			fi
 
		else
			echo "[$(my_date)] Server stopped and going to restart..." >> ${LOGS}
			sleep 5
			$SDEDI start
			sleep 5
			echo "Server restarted !"
			echo "[$(my_date)] Server restarted." >> ${LOGS}
		fi
 
	else
	    $SDEDI start
        sleep 5
	    echo "Server restarted !"
	    echo "[$(my_date)] Server restarted." >> ${LOGS}
	fi
 
	;;
 
# STATUS
 
  status)
 
  		if test_port; then
  			echo "Server is running ! PID : ${PID}"
		else 
			echo "[$(my_date)] Server is not running"
		fi
 
	;;
  *)
	echo "Usage: "$3" {start|stop|restart|status}"
	exit 1
esac
exit 0
L'exec PHP :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
[...]
 
$dossier = $row->folder;
$port = $row->tm_port;
$serv_path_dir = 'PATH_TO_FILE/server.sh';
$command = $serv_path_dir.' '.$dossier.' '.$port.' restart';
exec($command, $output);
 
[...]
Merci d'avance pour tous ceux qui pourront m'aider car là je sèche !