|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
Bonjour,
J'ai un petit souci pour le démarrage d'un shell sur le port COM. Sur le Module DIGI ME9210 j'ai un linux embarqué. D'origine dans Inittab j'ai: # Start busybox console ::respawn:/bin/cttyhack /bin/sh -l Le shell est bien présent. Mais je souhaite le lancer depuis mon logiciel.(Mes logiciels exactement) J'ai donc mis en commentaire: # Start busybox console #::respawn:/bin/cttyhack /bin/sh -l J'ai plusieurs logiciels réalisé par nos soins. Ont peux les considérer comme 2 pack. Le 1er et fourni avec l'image complète des partition (recompilation du noyau linux et Jffs2). Lorsque l'on nous livrera le module DIGI monté sur la carte ce logiciel sera intégré. Son but est de vérifier que le 2eme pack est présent. S'il n'est pas présent il démarre un shell. Pour ce faire j'ai intégré le code suivant: Code :
Donc une fois que l'on reçois les carte avec le module on ajoute le 2éme pack (en ftp d'ou mon souci sur un autre poste en VB.net http://www.developpez.net/forums/d12...x/#post6976873). Lorsque les fichiers sont uploader, au boot du module Digi notre 1er logiciel vérifie la présence du pack2 vu qu'il est maintenant présent il démarre mon logiciel. Si tout se passe bien aucun shell n'est lancé. Par contre grâce au entrées du module DIGI on souhaite pouvoir le lancer en monde TTY et donc lancer un shell. Pour ce faire je vérifie l'état des entrées puis si l'entrée qui va bien est activée ont démarre le shell. Donc idem je lance la commande: Code :
Etant encore en phase de développement je reconstruit mon image des partitions sans que le 1er logiciel démarre automatiquement. Au boot j'ai donc linux qui se lance mais j'ai pas la main du tout sur le Port COM. A l'aide de telnet je lance le 2éme logiciel et la le shell se lance sans souci. Je vois bien le message: BusyBox v1.15.2 (2009-12-03 15:11:08 CET) built-in shell (ash) Enter 'help' for a list of built-in commands. Idem si dans Inittab je lance le logiciel 2 au lieu du 1. C'est donc uniquement si depuis le logiciel 1 je lance le logiciel 2 puis je lance le cttyhack. Y a t'il une raison à cela ? en espérant avoir été suffisamment clair. Je précise que pour lancer le logiciel depuis inittab j'ai juste rajouté une ligne: ::sysinit: /sbin/MonLogiciel1 ou MonLogiciel2 Merci de votre aide car le je bloque vraiment. |
||||
|
|
00
|
|
|
#2 |
![]() ![]() Yoann SculoIngénieur Linux Embarqué Inscription : janvier 2006 Messages : 686 ![]() |
Quelle est la commande exacte que tu utilises dans ton inittab pour enchaîner tes 2 applications ?
A moins que tu lances appli 1 qui lance system(appli 2) qui elle même lance system(tty). Si c'est le cas, j'aurais plutôt tendance déjà à renvoyer une valeur d'erreur pour chaque processus et gérer les conditions un cran au dessus dans un script shell. Avec des valeurs de retour du type 0 si ok et -ERRNUM s'il y a une erreur. Comme ça tu sépares bien tes processus. C'est plus une question de forme, mais ça peut être source de problèmes d'enchaîner des appels system comme ça. (dans la mesure où tu perds les contextes de session). |
|
00
|
|
|
#3 |
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
Dans inittab je lance bien qu'un logiciel effectivement.
Je lance le logiciel1 qui regarde si le 2 est présent si non il lance le TTY. Sa sa marche. Lorsque le logiciel 1 voie le 2 il lance le 2 puis le 1 est tué. Le 2 lui contrôle les entrées. Si l'entrée pour avoir le mode TTY est activée c'est lui qui lance le TTY ensuite on le tue pas mais a la limite ont peu le tuer sans souci. Si l'entrée du mode TTY n'est pas active (sur le logiciel2 donc) il lance d'autre logiciels et contrôle qu'ils fonctionnent tous (snmpd, http, telnet sur le port 24 pour un mode transparent (Ethernet -> COM)). Ce qui est sur c'est que le logiciel 1 ou le logiciel 2 lance bien le TTY si je le lance seul. mais si le logiciel 1 lance le 2 qui lui lance le TTY la cela marche plus. Si je suis ton idée il faudrait que le logiciel 1 se lance, il lance le 2 si il est présent et attend une éventuelle réponse (code d'erreur du logiciel2) et suivant ce code d'erreur il lance le TTY. Va falloir que je regarde comment récupérer un code d'erreur sa j'ai jamais fait encore (enfin au lycée mais bon). |
|
|
00
|
|
|
#4 | ||
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
J'ai rée un petit script quie se lance a la suite des autres d'origine.
Code :
Si le fichier ncsmonitor est présent il le lance. Mais si je suis avec l'entrée déclarer TTY,il lance la console mais je n'est pas le promt. |
||
|
|
00
|
|
|
#5 |
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
Je viens de remarquer quelque chose quand même:
Lorsque je lance la le mode TTY grâce à inittab comme c'est d'origine lancer avec "::sysinit: modprobe gpio" Le message qui apparaît sur le port COM est: BusyBox v1.15.2 (2009-12-03 15:11:08 CET) built-in shell (ash) Enter 'help' for a list of built-in commands. / # Lorsque je lance le mode TTY garce à aux logiciel 1, Lancé avec la commande "system("/bin/cttyhack /bin/sh -l");" Le message qui apparaît est: BusyBox v1.15.2 (2009-12-03 15:11:08 CET) built-in shell (ash) Enter 'help' for a list of built-in commands. /bin/sh: can't access tty; job control turned off / # Il y a quand même "/bin/sh: can't access tty; job control turned off" en plus. Merci par avance pour votre aide car la je sèche complètement, après avec tenter avec les scrypt shell au resultat identique. |
|
|
00
|
|
|
#6 | |
![]() ![]() Yoann SculoIngénieur Linux Embarqué Inscription : janvier 2006 Messages : 686 ![]() |
Hum pas facile d'aider à distance comme ça, mais je suis curieux de savoir ce qu'il se passe exactement.
Citation:
dans ton script, le vois-tu apparaître ? Autre question bête, tu as bien viré tous les respawn de ton inittab ? Pour être sûr de bien comprendre, si tu mets ton précédent script en sysinit et que "/home/bin/ncsmonitor" n'est pas là il te lance la console, mais sans prompt. Càd ? Qu'est-ce qui te fait dire ça ? Mes questions peuvent sembler bêtes, mais je pense que le problème doit être assez tordu et à la fois simple à résoudre, il faut juste que l'on comprenne bien en détail ce qu'il se passe. |
|
|
00
|
|
|
#7 | ||||
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
Citation:
Citation:
Alors la aussi de souvenir il me semble qu'il y avait que cttyhack qui était lancé avec respawn. D'ailleurs ce mode m’échappe un peu, va falloir que je regarde ce que c’est exactement. Citation:
Citation:
Alors je vais essayer de résumer. Pour le moment j'oublie le scrip.sh. Les Logiciels sont réalisés en C. Donc dans le inittab: j'ai ajouté le démarrage du Driver GPIO J'ai mis en commentaire le démarrage du cttyhack Et je lance mon Logiciel1 avec la commande "::sysinit: /sbin/Logiciel1" Logiciel1: Il regarde si /home/bin/Logiciel2 est présent S'il est présent il fait un chmod 777 /home/bin/* (les fichiers étant passés par ftp) Puis il lance le logiciel2 par la commande "system(/home/bin/Logiciel2)" Puis il se coupe "return 0;" si /home/bin/Logiciel2 n'est pas présent Il lance le prompt par la commande "system(/bin/cttyhack /bin/sh -l) La j'ai bien le prompt, mais il apparaît une ligne indiquant quand même un truc qui tourne pas rond: BusyBox v1.15.2 (2009-12-03 15:11:08 CET) built-in shell (ash) Enter 'help' for a list of built-in commands. /bin/sh: can't access tty; job control turned off / # Logiciel2: Logiciel2 est notre logiciel de gestion et contrôle de l'activité de nos services Lorsque logiciel2 démarre il contrôle l’état des entrées. Si rien n'est présent il démarre nos services (snmpd, httpd, un telnetd sur le port 24 pour conversion Ethernet/port serie etc...) Ensuite il contrôle que tout ces logiciels sont toujours en activité par leur PID. La pas de souci tout fonctionne. Si L'utilisateur à besoin d'un prompt sur le port COM il strap l'une des entrées, il reset le module. Au boot Logiciel1 fait sont même boulot puis lance Logiciel2 Logiciel2 contrôle les entrées au démarrage puis détecte l'entrée présente. Il démarre donc uniquement le mode tty par la même commande qu'il y a dans logiciel1 c'est a dire: "system(/bin/cttyhack /bin/sh -l) Et la j'ai rien du tout, pas de promt. De souvenir par telnet il me semble que si j'execute la commande PS, j'ai pas "cttyhack" mais je vois uniquement "/bin/sh" (a confirmer si c'est important, car j'ai un doute) Voila. Autre bidouille pour essayer de bien comprendre. Si dans inittab maintenant je démarre pas Logiciel1 mais je lance Logiciel2 (les fichiers sont bien présent et exécutable bien-sur avant). Je boot le module en mode TTY avec l'entrée active, il démarre Logiciel2 puis lance le cttyhack avec la même ligne bizarre qu'avec logiciel1 mais j'ai le prompt et peux exécuter des commandes. J’espère que cela peut vous aidez à comprendre afin de résoudre mon souci. En tout cas c'est super sympa de tenter de m'aider car la je sèche complètement. Et mon niveau actuel dans ce domaine est vraiment limité. |
||||
|
|
00
|
|
|
#8 |
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
Voila mon Inittab:
# Early mount proc to be able to parse /proc/cmdline in bootscripts ::sysinit:/bin/mount -t proc proc /proc # Start any script in init.d ::sysinit:/etc/init.d/rcS # Start telnet daemon. ::sysinit:/bin/sh -l -c '/usr/sbin/telnetd -l /bin/sh' # Start gpio driver ::sysinit: modprobe gpio # Start busybox console #::respawn:/bin/cttyhack /bin/sh -l # Stuff to do for the 3-finger salute ::ctrlaltdel:/sbin/reboot #Start Monitor ::sysinit: /sbin/monitor |
|
|
00
|
|
|
#9 | ||||||
![]() ![]() Yoann SculoIngénieur Linux Embarqué Inscription : janvier 2006 Messages : 686 ![]() |
Bon génial ... toute ma réponse a disparu a cause de cette fichue sécu "Votre envoi ne peut pas être exécuté car la marque de sécurité a expiré."
Je recommence -_- Pourquoi utiliser sh ici ? Code :
::sysinit:/bin/sh -l -c '/usr/sbin/telnetd -l /bin/sh' Code :
::sysinit:/usr/sbin/telnetd -l /bin/sh Je te propose de faire le test suivant : 1) Confirme moi que l'inittab suivant fonctionne, et que tu as bien une console : Code :
3) Modifie Logiciel2 de façon à ce qu'il retourne 0 si tout se passe bien et 1 si le strap est mis en mode TTY. 4) Lance cette fois l'inittab suivant : Code :
Code :
Mais comme ça on va pouvoir avancer et se rapprocher de la source du pb. |
||||||
|
00
|
|
|
#10 |
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
Merci pour toutes ces informations.
-Pour le lancement de telnet j'ai rien changé il était comme cela lors de la compilation du projet avec Digi EL (eclipse fourni par DIGI) et pré-configuré. Toutefois j'ai essayé avec: ::sysinit:/usr/sbin/telnetd -l /bin/sh Mais cela change rien, par contre j'ai trouvé comme obliger à ce loguer lors d'une session telnet j'ai changer la commande par: ::sysinit:/bin/sh -l -c '/usr/sbin/telnetd -l /bin/login' 1) Pour info /sbin/monitor que l'on voie dans 'inittab c'est mon Logiciel1. Oui le prompt est bien présent. Avant de continuer j'ai trouvé une solution qui fonctionne mais avec le message d'erreur présent. Au lieu de lancer: system("/bin/cttyhack bin/sh -l"); Je lance: system("/bin/sh < /dev/ttyS0 > /dev/ttyS0"); Et la quelque que soit le logiciel qui le lance, Logiciel1->TTY ou Logiciel2->TTY ou Logiciel1->Logiciel2->TTY cela fonctionne mais avec le message en gras: BusyBox v1.15.2 (2009-12-03 15:11:08 CET) built-in shell (ash) Enter 'help' for a list of built-in commands. /bin/sh: can't access tty; job control turned off / # Message que je n'est pas si je lance le promt avec Inittab. Revenons à tes demandes: 2)Pour logiciel1 c'est fait déjà il retourne 0 s'il lance Logiciel2 et 1 s'il devait lancé le prompt. 3) La cela va être difficile car lorsque tout se passe bien il faut que Logiciel2 reste en fonctionnement, si je retourne un 0 il va se tuer (ou j'ai mal compris).Ce logiciel lance mes autres logiciels (services) et contrôle leur fonctionnement en vérifiant leur PID. Est-qu'il peut retourner un 0 tout en continuant a fonctionné ??? Pour un return 1 la il n'y aurait pas de souci. Pour la suite du coup je suis bloqué mais je comprend le code que tu a écrit. Je vais essayer quand même pour voir ce que cela donne. Apparemment /bin/cttyhack vérifier la présence entre autre du port série, puis lance bin/sh. C'est pour cela que j'ai donc virer /bin/cttyhack pour n'utiliser que /bin/sh et le rediriger vers le port COM. Cela fonctionne mais avec cette ligne de défaut. |
|
|
00
|
|
|
#11 |
![]() ![]() Yoann SculoIngénieur Linux Embarqué Inscription : janvier 2006 Messages : 686 ![]() |
Ah d'accord, monitor est ton Logiciel1, oui, donc il faut modifier le script en conséquence.
En fait, si je ne me trompe pas, cttyhack te sert dans les systèmes où tes ttty ne sont pas forcément connus. Son but est de trouver la console et l'ouvrir. Cependant, si tu connais ta console, qu'elle est fixe. Tu peux utiliser getty à la place, qui généralement est mis en respawn dans l'inittab (ce qui n'est pas ton cas ici cependant) Concernant le Logiciel2, pas grave s'il ne se termine jamais quand tout se passe bien, ça fonctionnera quand même si tu termines en revoyant 1 en cas de TTY. Par contre, oui il n'est pas possible de renvoyer une valeur de retour sans terminer ton programme. |
|
00
|
|
|
#12 |
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
Est-ce bon de lancé le shell de cette manière:
system("/bin/sh < /dev/ttyS0 > /dev/ttyS0"); Car la cela fonctionne mais toujours avec le message d'erreur: /bin/sh: can't access tty; job control turned off Je n'est pas de getty dans /bin C'est pas simple cette histoire... Je vais tester tout sa.. Merci |
|
|
00
|
|
|
#13 |
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
Bon, on a réussi avec l'aide d'un collègue en glanant des informations à droite et à gauche.
Voici ce que je lance maintenant à partir de mes logiciels: system("setsid sh -c 'exec sh </dev/ttyS0 >/dev/ttyS0 2>&1' &"); et plus de souci. |
|
|
00
|
|
|
#14 | |
![]() ![]() Yoann SculoIngénieur Linux Embarqué Inscription : janvier 2006 Messages : 686 ![]() |
Oui c'est en effet ce que propose la doc de cttyhack
Citation:
getty est un applet de busybox. Donc soit le lien n'existe pas, (essayer busybox getty) soit il faut activer l'applet dans la config de busybox à la compilation. |
|
|
00
|
|
|
#15 |
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
Je vais essayer avec getty.
En tout cas un grand merci d'avoir suivi mon souci sur ce sujet qui me dépasse. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com