Forum Programmation.shell SIgnaux temps réels (RTMIN ...)

Posté par  .
Étiquettes : aucune
0
15
fév.
2007
Bonjour,

J'ai un script shell qui s'execute sous différentes plateformes, notamment tru64 et des machines linux standard.
Dans ce script une ligne de commande effectue :

kill -RTMIN $PID

sous true64 (et en korn shell), aucun problème le script fonctionne correctement. Ce n'est en revanche pas le cas sous Linux.
En théorie de ce que j'ai pu glaner comme informations, les signaux temps réels sont "en général" du numéro 32 (RTMIN) au numéro 63 (RTMAX). Il faut cependant utilliser les dénominations RTMIN RTMIN+1 etc puisque le numéro associé peut différer d'une machine à l'autre.

Mon problème lorsque j'éxecute ce script est qu'il me donne un résultat du genre :

[...] bad signal 'RTMIN'

J'ai déjà essayé de remplacer par SIGRTMIN, même résultat. Autre bizzarerie, je suis par défaut en bash et un kill -l me donne :

1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1
36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
64) SIGRTMAX

mais si je passe en korn shell : kill -l donne :

1 HUP Hangup 33 33 Signal 33
2 INT Interrupt 34 34 Signal 34
3 QUIT Quit 35 35 Signal 35
4 ILL Illegal instruction 36 36 Signal 36
5 TRAP Trace trap 37 37 Signal 37
6 ABRT Abort 38 38 Signal 38
7 BUS Bus error 39 39 Signal 39
8 FPE Floating point exception 40 40 Signal 40
9 KILL Killed 41 41 Signal 41
10 USR1 User defined signal 1 42 42 Signal 42
11 SEGV Memory fault 43 43 Signal 43
12 USR2 User defined signal 2 44 44 Signal 44
13 PIPE Broken pipe 45 45 Signal 45
14 ALRM Alarm clock 46 46 Signal 46
15 TERM Terminated 47 47 Signal 47
16 STKFLT Stack fault 48 48 Signal 48
17 CHLD Child exited 49 49 Signal 49
18 CONT Continued 50 50 Signal 50
19 STOP Stopped (signal) 51 51 Signal 51
20 TSTP Stopped 52 52 Signal 52
21 TTIN Stopped (tty input) 53 53 Signal 53
22 TTOU Stopped (tty output) 54 54 Signal 54
23 URG Urgent I/O condition 55 55 Signal 55
24 XCPU CPU time limit exceeded 56 56 Signal 56
25 XFSZ File size limit exceeded 57 57 Signal 57
26 VTALRM Virtual timer expired 58 58 Signal 58
27 PROF Profiling timer expired 59 59 Signal 59
28 WINCH Window size change 60 60 Signal 60
29 IO I/O possible 61 61 Signal 61
30 PWR Power-fail/Restart 62 62 Signal 62
31 UNUSED Unused 63 63 Signal 63
32 32 Signal 32 64 64 Signal 64

juste pour info sur ma machine (tru64) : kill -l donne :

1) HUP 13) PIPE 25) XFSZ 37) RTMIN+4
2) INT 14) ALRM 26) VTALRM 38) RTMIN+5
3) QUIT 15) TERM 27) PROF 39) RTMIN+6
4) ILL 16) URG 28) WINCH 40) RTMIN+7
5) TRAP 17) STOP 29) PWR 41) RTMAX-7
6) LOST 18) TSTP 30) USR1 42) RTMAX-6
7) EMT 19) CONT 31) USR2 43) RTMAX-5
8) FPE 20) CHLD 32) RESV 44) RTMAX-4
9) KILL 21) TTIN 33) RTMIN 45) RTMAX-3
10) BUS 22) TTOU 34) RTMIN+1 46) RTMAX-2
11) SEGV 23) POLL 35) RTMIN+2 47) RTMAX-1
12) SYS 24) XCPU 36) RTMIN+3 48) RTMAX

si je remplace dans mon script RTMIN par 34, alors il marche ...

mais mon script commence par #!/bin/ksh alors que l'association de 34 au signal RTMIN correspond a priori au bash ...

bref je suis perdu, si quelqu'un pourrait m'éclaircir le sujet car au final mon objectif :

> avoir un script unique pour les deux plateformes (ou il n'y a pas de if linux blabla, if tru64 blabla) ou l'on utilise pas le numéro du signal mais bien son appellation (RTMIN).

Merci d'avance ! Toute information complémentaire même si ne répondant pas tout à fait à mon attente est la bienvenue !
  • # Binaire ou commande interne...

    Posté par  . Évalué à 2.

    Salut,

    Lorsque tu exécutes la commande kill, c'est certainement la commande kill interne au shell qui est exécutée. Or, le signal RTMIN est bien défini dans le kill de bash, mais pas dans celui de ksh (ou de zsh).

    A mon avis, le mieux serait d'utiliser explicitement le binaire qui se trouve dans /bin/kill (normalement /bin/kill devrait exister aussi bien sous linux que true64) : ça devrait régler les problème de différences entre les shells et de portabilité.

    A+
    JJD
    • [^] # Re: Binaire ou commande interne...

      Posté par  . Évalué à 2.

      Merci,

      cela me permet d'etre sur d'utiliser le binaire mais malheureusement il me sort lors de l'utilisation l'erreur suivante :

      kill: unknown signal RTMIN; valid signals:
      HUP INT QUIT ILL ABRT FPE KILL SEGV PIPE ALRM TERM USR1 USR2 CHLD CONT
      STOP TSTP TTIN TTOU TRAP IOT BUS SYS STKFLT URG IO POLL CLD XCPU XFSZ
      VTALRM PROF PWR WINCH UNUSED

      ... il doit donc manquer dans certains fichiers l'association du signal RTMIN à son numéro. Et comme son numéro peut potentiellement changer en fonction des différentes distribution de linux par ex je ne peux utiliser directement kill -34 par ex.

      donc le seul moyen que j'ai trouvé est de malgré mes réticenses faire une structure :

      Si Tru64
      kill -RTMIN $PID
      Si Linux
      ID_RTMIN=getRTMIN
      kill -$ID_RTMIN $PID
      fin si

      ou getRTMIN est un tout petit programme c qui récupère le numéro du signal RTMIN courrant sur la machine grâce à une fonction : __libc_current_sigrtmin () , trouvée en fouinant un peu dans /usr/include/bits/signum.h .

      mais bon si quelqu'un à une autre idée qui rendrait tout ça plus propre je suis preneur !

      En tout cas merci de ta première réponse
  • # merci

    Posté par  . Évalué à 1.

    Merci,

    cela me permet d'etre sur d'utiliser le binaire mais malheureusement il me sort lors de l'utilisation l'erreur suivante :

    kill: unknown signal RTMIN; valid signals:
    HUP INT QUIT ILL ABRT FPE KILL SEGV PIPE ALRM TERM USR1 USR2 CHLD CONT
    STOP TSTP TTIN TTOU TRAP IOT BUS SYS STKFLT URG IO POLL CLD XCPU XFSZ
    VTALRM PROF PWR WINCH UNUSED

    ... il doit donc manquer dans certains fichiers l'association du signal RTMIN à son numéro. Et comme son numéro peut potentiellement changer en fonction des différentes distribution de linux par ex je ne peux utiliser directement kill -34 par ex.

    donc le seul moyen que j'ai trouvé est de malgré mes réticenses faire une structure :

    Si Tru64
    kill -RTMIN $PID
    Si Linux
    ID_RTMIN=getRTMIN
    kill -$ID_RTMIN $PID
    fin si

    ou getRTMIN est un tout petit programme c qui récupère le numéro du signal RTMIN courrant sur la machine grâce à une fonction : __libc_current_sigrtmin () , trouvée en fouinant un peu dans /usr/include/bits/signum.h .

    mais bon si quelqu'un à une autre idée qui rendrait tout ça plus propre je suis preneur !

    En tout cas merci de ta première réponse

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.