Bash/Shell: Exécuter un programme
nonodu003
Messages postés
61
Statut
Membre
-
nonodu003 Messages postés 61 Statut Membre -
nonodu003 Messages postés 61 Statut Membre -
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:
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:
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:
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
A voir également:
- Bash/Shell: Exécuter un programme
- Classic shell - Télécharger - Personnalisation
- Bingo bash free - Télécharger - Divers Jeux
- Bash do while ✓ - Forum Shell
- Bash addition - Forum Shell
- Classic shell c'est quoi ✓ - Forum Windows 10
8 réponses
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.
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.
C'est quoi les logs? Si sa vient des droits comment je fais pour les regarder et comment je les modifier? ^^
hello
esayer de remplacer ./ par le chemin complet et capturer les messages:
esayer de remplacer ./ par le chemin complet et capturer les messages:
system("/chemin/exec.sh >/tmp/log 2>&1");
J'ai fait ceci:
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.
$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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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?
/Users/nom/programme/exec.sh a bien les droits d'être exécuté par l'utilisateur de la tâche php?
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?
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?
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.
/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.
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
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
Ok. Merci beaucoup ! Je me suis rendu compte que le dossier /Volumes/ n'avait pas le même UID et GID.
J'ai ceci:
Mais moi je veux ceci:
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:
Mais cela ne fonctionne pas ! Pourquoi ?! --"
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 ?! --"