CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[shell] detecter mort par signal

godrik
godrik
Niveau 30
28 septembre 2018 à 22:57:01

Plop les gens,

J'ai un script bash qui demare un programme. Quand il a termine, j'ai besoin de savoir si le program a termine a cause d'un signal, ou si il a termine normalement.
Est ce qu'il y a une facon de savoir ca?
Je pourrais regarder le exitcode, mais ce n'est pas une methode satisfaisante parcequ'il est possible que main finisse par "return rand();"

Pseudo supprimé
Pseudo supprimé 28 septembre 2018 à 23:09:33

Tu peux te faire un programme simple qui lance ton programme, et qui te codifie son retour pour que tu puisse faire la différence entre un programme signalé ou un programme qui a retourné un entier.

main finisse par "return rand();"

T'as vraiment un prog qui fait ça ? Qui l'a codé ? Pourquoi ?

edit: je viens de lire la page de wait(1p). Il s'y dit des choses intéressantes.

Message édité le 28 septembre 2018 à 23:11:59 par Pseudo supprimé
godrik
godrik
Niveau 30
29 septembre 2018 à 01:01:34

Le 28 septembre 2018 à 23:09:33 SithisMinion a écrit :
Tu peux te faire un programme simple qui lance ton programme, et qui te codifie son retour pour que tu puisse faire la différence entre un programme signalé ou un programme qui a retourné un entier.

edit: je viens de lire la page de wait(1p). Il s'y dit des choses intéressantes.

hum... interessant. Il faudra tester un peu, mais ca a l'air de resoudre mon probleme. Je ne savais pas que wait(2) savait faire la difference sur la raison de la terminaison...

main finisse par "return rand();"

T'as vraiment un prog qui fait ça ? Qui l'a codé ? Pourquoi ?

C'est du code d'etudiant et des fois ils retournent un truc debile sans raison aucune.

cimer!

Pseudo supprimé
Pseudo supprimé 29 septembre 2018 à 14:18:37

Je ne savais pas que wait(2) savait faire la difference sur la raison de la terminaison...

Ha ben si forcément. POSIX est une norme très sérieuse. Ils ont pensé à énormément de choses. Ce ne sont pas des amateurs.

stacksmashing
stacksmashing
Niveau 6
29 septembre 2018 à 16:55:02
cmd=$(strace ./dd &> logs)
[[ `tail -n 1 logs | grep "SIGKILL"` ]] && echo "sigkilled!" || echo "pastué"
[[ `tail -n 1 logs | grep "SIGTRAP"` ]] && echo "sigtrapped!" || echo "pastué"
# Autres signaux ici
[[ `tail -n 1 logs | grep "+++ exited with 0 +++"` ]] && echo "exit with status code!" 

edit: Il y a même des options à strace pour filtrer uniquement certains signaux, histoire d'avoir un fichier logs moins volumineux

-e trace=signal (deprecated)
Trace all signal related system calls.
-e signal=set
Trace only the specified subset of signals. The default is signal=all. For example, signal=!SIGIO (or signal=!io) causes
SIGIO signals not to be traced.

:hap:

Message édité le 29 septembre 2018 à 16:59:10 par stacksmashing
godrik
godrik
Niveau 30
29 septembre 2018 à 17:20:08

Le 29 septembre 2018 à 14:18:37 SithisMinion a écrit :

Je ne savais pas que wait(2) savait faire la difference sur la raison de la terminaison...

Ha ben si forcément. POSIX est une norme très sérieuse. Ils ont pensé à énormément de choses. Ce ne sont pas des amateurs.

Tout a fait. Et ca a du sens que wait puisse savoir ca. Parceque si tu es tue par signal, l'application n'a pas fournit de code de retour. Donc il faut pouvoir obtenir cette information la. (Et d'ailleurs bash te le dis dans stderr.) Visiblement, ca fait longtemps que je n'ai pas fais de gestion de processus.

Le 29 septembre 2018 à 16:55:02 Stacksmashing a écrit :
cmd=$(strace ./dd &> logs) [[ `tail -n 1 logs | grep "SIGKILL"` ]] && echo "sigkilled!" || echo "pastué" [[ `tail -n 1 logs | grep "SIGTRAP"` ]] && echo "sigtrapped!" || echo "pastué" # Autres signaux ici [[ `tail -n 1 logs | grep "+++ exited with 0 +++"` ]] && echo "exit with status code!"

edit: Il y a même des options à strace pour filtrer uniquement certains signaux, histoire d'avoir un fichier logs moins volumineux

-e trace=signal (deprecated)
Trace all signal related system calls.
-e signal=set
Trace only the specified subset of signals. The default is signal=all. For example, signal=!SIGIO (or signal=!io) causes
SIGIO signals not to be traced.

:hap:

C'est pas bete. Mais ca a l'air dangereux d'utiliser strace j'ai l'impression. Deja ca va faire plein de log potentiellement, mais aussi tu pourrais interpreter les messages incorrectement. Peut etre tu as pris un SIGUSR1, mais tu as un signal handler et donc il a pas causer la mort. Ou un truc du genre. wait a l'air beaucoup plus foolproof.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware