Bash/Shell: Exécuter un programme

Fermé
nonodu003 Messages postés 59 Date d'inscription jeudi 11 avril 2013 Statut Membre Dernière intervention 13 mai 2013 - 7 mai 2013 à 16:36
nonodu003 Messages postés 59 Date d'inscription jeudi 11 avril 2013 Statut Membre Dernière intervention 13 mai 2013 - 13 mai 2013 à 14:12
Bonjour tout le monde,

Voilà j'ai un problème que je ne comprend pas moi-même. J'ai un fichier nommé exec.sh contenant un script shell. Lorsque je double-clic dessus, des programmes s'exécutent afin d'analyser des fichiers. Un premier programme, écrit en C++, s'exécute et me crée deux fichiers .cvs. Ensuite, un deuxième programme, écrit en R, s'exécute et me crée un fichier pdf à partir des deux fichiers précédents. Ce fichier pdf contient 4 graphiques.

Moi, je souhaite mettre en ligne ce programme (je l'ai déjà fait pour un autre programme). Pour cela, je crée une interface web et sur l'une de mes pages php, j'exécute le fichier exec.sh à l'aide de la fonction system().

De cette façon:
system("./exec.sh");


Mon problème c'est que cela ne fonctionne pas. Le programme écrit en C++ ne s'exécute pas et donc le programme R n'ont plus. Du coup, je n'ai pas mon fichier pdf. J'ai déjà réalise ce genre d'interface avec un autre programme mais c'était le programme R qui ne s'exécutais pas. Du coup, on m'a conseillé d'importer une library R dans mon script shell.

De cette façon:
export DYLD_LIBRARY_PATH=/Library/Frameworks/R.framework/Resources/lib/x86_64/libR.dylib:DYLD_LIBRARY_PATH


De cette façon, mon programme s'exécute parfaitement. Du coup, j'ai fait la même chose pour ce nouveau programme. Mais bon, cette fois le problème vient de C++.

Du coup, je me demandais si je devais pas importer un library de ce genre mais pour c++? Sinon, je ne voit pas d'où peut provenir le problème.

Le truc c'est que mon programme c++ s'exécute parfaitement lorsque l'on double clic sur exec.sh. Et je ne sais pas pourquoi mais avec la fonction system() il ne s'exécute pas. Le problème ne vient pas de la fonction system() j'ai fait plusieurs test.
Du coup, le problème doit venir du php et de shell, mais à part la library je n'ai aucune idée d'ou le problème peut venir. Est-ce qu'il existe une library au moins ?

Quelqu'un peut m'aider ou me donner son avis s'il vous plait !

Merci d'avance.

Voici mon script shell, exec.sh, si sa peut aider:
cd /Users/nom/programme/
echo "" > chrono.txt
echo "" > reflex.txt
ls /Volumes/Data/RawData | grep dat | cut -d"." -f1 >> reflex.txt
 
acc=0
k=0
for j in 'cat reflex.txt'; do
    echo "$j" | ./traitement&
    k=$(($k+1))
    acc=$(($acc+1))
    if [ $k = 1 ]; then
                k=0
        wait
    fi
done
wait
 
export DYLD_LIBRARY_PATH=/Library/Frameworks/R.framework/Resources/lib/x86_64/libR.dylib:DYLD_LIBRARY_PATH
R CMD BATCH --vanilla /Users/nom/programme/src/Graphique.R log.txt
 
path='pwd'
cd /Volumes/Data/Output
zip $path\/outputs.zip OutputR/*.csv OutputCherryPick/*.csv OutputPdf/*.pdf
cd $pwd
rm /Volumes/Data/Output/OutputR/*.csv /Volumes/Data/Output/OutputCherryPick/*.csv /Volumes/Data/Output/OutputPdf/*.pdf

8 réponses

gardiendelanuit Messages postés 1769 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 19 novembre 2016 264
7 mai 2013 à 17:12
Bonjour,

Il faudrait regarder les logs si c'est un dédié (serveur)
De grandes chance que celà vienne des problème de droits.
Hébergement mutualisé = pas de lancement d'application la plupart du temps.
0
nonodu003 Messages postés 59 Date d'inscription jeudi 11 avril 2013 Statut Membre Dernière intervention 13 mai 2013 1
10 mai 2013 à 10:11
C'est quoi les logs? Si sa vient des droits comment je fais pour les regarder et comment je les modifier? ^^
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
10 mai 2013 à 11:04
hello
esayer de remplacer ./ par le chemin complet et capturer les messages:
system("/chemin/exec.sh >/tmp/log 2>&1");
0
nonodu003 Messages postés 59 Date d'inscription jeudi 11 avril 2013 Statut Membre Dernière intervention 13 mai 2013 1
10 mai 2013 à 11:20
J'ai fait ceci:
$return_valeur = system("/Users/nom/programme/exec.sh >/tmp/log 2>&1");
echo "$return_valeur *** <br/>";


Mais mon $return_valeur est vide. Je n'ai plus le message d'erreur mais c'est pas pour cela que le programme c++ s'est exécuté.

Si j'ai bien compris ta commande, un dossier tmp devrais se crée avec un fichier log à l'intérieur? Si oui, je l'ai pas trouvé. J'ai essayé de créer le dossier tmp dans le même dossier que exec.sh et idem log ne s'est pas crée.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
10 mai 2013 à 12:19
c'est un système Unix ? /tmp doit exister
/Users/nom/programme/exec.sh a bien les droits d'être exécuté par l'utilisateur de la tâche php?
0
nonodu003 Messages postés 59 Date d'inscription jeudi 11 avril 2013 Statut Membre Dernière intervention 13 mai 2013 1
10 mai 2013 à 14:08
Je travaille sur un MAC OS (ce n'est pas mon ordi et c'est la première fois que je travaille sur un mac ^^).

exec.sh a les droits pour être exécuté en fesant un ls -l sur le terminal je trouve ceci:
-rwxrwxrwx

Par contre, je sais pas s'il a les droits pour php. Comment je peux le savoir?
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
10 mai 2013 à 14:33
ps -ef montre toutes les tâches et l'utilisateur (colonne UID). exec.sh a bien tout les droits mais il faut vérifier tout le chemin, par ex. nom peut protégé
ls -ld /Users ;ls -ld /Users/nom ; ls -ld /Users/nom/programme/
0
nonodu003 Messages postés 59 Date d'inscription jeudi 11 avril 2013 Statut Membre Dernière intervention 13 mai 2013 1
Modifié par nonodu003 le 10/05/2013 à 15:08
J'ai fait la vérification avec les ls -ld j'obtiens ceci:

/Users => drwxr-xr-x
/Users/nom => drwxr-xr-x+
/Users/nom/Programme/ => drwxr-xr-x
/Users/nom/programme/exec.sh => -rwxrwxrwx

Du coup, j'ai été curieuse de voir les droits pour l'interface de l'autre programme que j'ai déjà réaliser et qu'il fonctionne correctement (qui exécute une autre exec.sh). Et j'obtiens les résultats suivant pour l'interface qui fonctionne:

/Users => drwxr-xr-x
/Users/nom => drwxr-xr-x+
/Users/nom/Programme2/ => drwxr-xr-x
/Users/nom/Programme2/exec2.sh => -rwxr-xr-x

Les droits sont différents, mais bon je crois que c'est différent pour les droits d'écriture, donc ce n'est pas sa qui pause un problème.
0
nonodu003 Messages postés 59 Date d'inscription jeudi 11 avril 2013 Statut Membre Dernière intervention 13 mai 2013 1
10 mai 2013 à 15:03
Je viens de penser à un truc. La différence entre cette interface et l'autre, c'est que l'autre (celui qui fonctionne) utilise des fichiers et crées les fichiers dans le même dossier que exec.sh.

Alors que dans ce cas, le fichier exec.sh que j'exécute est dans ce dossier: /Users/nom/programme/
Exec.sh exécute un premier programme c++ grâce à des fichiers uploadés dans le dossier:
/Volumes/Data/RawData
Le c++ me crée mes deux fichiers .cvs dans le dossier:
/Volumes/Data/Output

Du coup, je viens de penser à vérifier aussi les droits pour ces dossiers avec un ls -ld et j'obtiens ceci:

/Volumes/ => drwxrwxrwt@
/Volumes/Data/ => drwx---r-x+
/Volumes/Data/RawData/ => drwxr-xr-x
/Volumes/Data/output => drwxr-xr-x
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
10 mai 2013 à 15:39
seul le popriétaire a le droit d'écrire dans /Volumes/Data/output
donc la tâche qui exécute exec.sh doit être le même UID que montré par un ls -l /Volumes/Data/output
0
nonodu003 Messages postés 59 Date d'inscription jeudi 11 avril 2013 Statut Membre Dernière intervention 13 mai 2013 1
10 mai 2013 à 15:55
ok du coup, je dois modifier les droits pour /Volumes/Data/Output ??
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
10 mai 2013 à 16:14
oui si les UID sont différents
ou donner le droit w au groupe, changer le GID et mettre les 2 UID dans le même groupe
ou mettre le dossier en rwxrwxrwx (777) juste le temps d'essayer
0
nonodu003 Messages postés 59 Date d'inscription jeudi 11 avril 2013 Statut Membre Dernière intervention 13 mai 2013 1
10 mai 2013 à 16:46
Ok. Mais je les ai comment uid et gid?
Je sais que uid est pour l'utilisateur, gid est pour le groupe. Mais franchement, je vois pas ou s'est et comment on les modifie?
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
11 mai 2013 à 08:34
UID et GID des fichiers avec ls -l
pour modifier les droits et/ou propriétaire : voir chmod chown chgrp
0
nonodu003 Messages postés 59 Date d'inscription jeudi 11 avril 2013 Statut Membre Dernière intervention 13 mai 2013 1
Modifié par nonodu003 le 13/05/2013 à 11:13
Ok. Merci beaucoup ! Je me suis rendu compte que le dossier /Volumes/ n'avait pas le même UID et GID.

J'ai ceci:
drwxrwxrwt@ 7 root  admin  238 May  6 10:16 /Volumes/ 


Mais moi je veux ceci:
drwxrwxrwt@ 7 nom  staff  238 May  6 10:16 /Volumes/ 


Du coup, j'ai essayé de modifié le propriétaire mais je n'y arrive pas. J'ai essayé de modifier les propriétaires avec la commande CHOWN comme ceci:
chown root:nom /Volumes/ 


Mais cela ne fonctionne pas ! Pourquoi ?! --"
0
nonodu003 Messages postés 59 Date d'inscription jeudi 11 avril 2013 Statut Membre Dernière intervention 13 mai 2013 1
13 mai 2013 à 11:16
J'ai aussi essayé de cette façon:
chown nom /Volumes/


Mais ça me met ceci:
chown: /Volumes/: Operation not permitted
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 13/05/2013 à 11:25
il faut les droits root pour changer des droits, donc sudo chown ....
0
nonodu003 Messages postés 59 Date d'inscription jeudi 11 avril 2013 Statut Membre Dernière intervention 13 mai 2013 1
13 mai 2013 à 11:31
sudo chown ?? Qu'est ce que c'est ?
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
13 mai 2013 à 13:20
sudo donne les droits root donc les privilèges à la commande qui suit
pour éviter l'erreur chown: /Volumes/: Operation not permitted
0
nonodu003 Messages postés 59 Date d'inscription jeudi 11 avril 2013 Statut Membre Dernière intervention 13 mai 2013 1
13 mai 2013 à 14:12
ok merci je vais essayer
0