18 octobre 2013

Récupérer un fichier supprimé sous Unix

Le sous répertoire "fd"(pour "file descriptor") dans le répertoire au /proc/<PID> permet de faire le bilan des "fichiers" (au sens large) accédés par un processus Unix actif. Ci dessous pour le processus OpenHR dont le PID est 16964 :

ps -fp 16964 
UID        PID  PPID  C STIME TTY          TIME CMD
hradev   
16964  1  1 10:41 pts/4    00:00:16 /usr/java1.6/bin/java -Xms64M -Xmx128M -classpath /hradev/openhr/bin/bootstrap.jar 

ls /proc/16964/fd
0  10  12  14  16  18  2   21  23  25  27  29  30  32  34  36  38  4   41  43  45  47  49  50  52  54  57  
1  11  13  15  17  19  20  22  24  26  28  3   31  33  35  37  39  40  42  44  46  48  5   51  53  55  59

Un "ls -l" affichera (sous Linux) le lien entre le numéro du "descripteur de fichier" et sa cible :

ls -l /proc/16964/fd
lr-x------ 1 hradev hradev 64 18 oct.  10:58 0 -> /dev/null
l-wx------ 1 hradev hradev 64 18 oct.  10:58 1 -> /dev/null
lr-x------ 1 hradev hradev 64 18 oct.  10:58 10 -> /hradev/openhr/lib/commons-codec-1.6.jar
lr-x------ 1 hradev hradev 64 18 oct.  10:58 11 -> /hradev/openhr/lib/commons-net-3.0.1.jar
lr-x------ 1 hradev hradev 64 18 oct.  10:58 12 -> /hradev/openhr/lib/hr-kernel-7.30.03007.1234.jar
lr-x------ 1 hradev hradev 64 18 oct.  10:58 13 -> /hradev/openhr/lib/commons-httpclient-3.1.jar

...
l-wx------ 1 hradev hradev 64 18 oct.  10:58 52 -> /hradev/openhr/logs/ophrs.log (deleted)

On notera que le descripteur de fichier 52 pointe  sur un fichier qui a été supprimé : le log de OpenHR.

Toutefois, le processus OpenHR étant encore actif et n'ayant pas libéré le fichier, ce dernier est encore "présent"... Même s'il n'est plus affiché à l'utilisateur qui liste le contenu du répertoire :

ls -l /hradev/openhr/logs/ophrs.log
ls: impossible d'accéder à /hradev/openhr/logs/ophrs.log: Aucun fichier ou dossier de ce type

Il peut donc être consulté, voir recopié (dans un cas comme celui du ophrs.log, n'essayez pas de restaurer le fichier : vous créeriez un "nouveau" fichier log dont le descripteur de fichier sera différent de celui d'origine).

tail /proc/16964/fd/52
2013-10-18 10:41:42,619 INFO  [        ][               ][main] - OPHRS1999 OpenHR server is ready for business (Release <7.000>)
2013-10-18 10:42:41,294 INFO  [000000B7][188.8.244.10   ][MessageProcessor-2] - OPHRS1077 Queued a new message for service <Default>
2013-10-18 10:44:05,419 INFO  [00000305][188.8.244.10   ][MessageProcessor-2] - OPHRS1200 Using strategy <com.hraccess.dispatcher.service.login.uid.SimpleVirtualSessionIdGenerator> to create virtual session IDs


Plus de détails sur : http://www.hackinglinuxexposed.com/articles/20020507.html

11 octobre 2013

BQL-BBAD0012-DEPASSEMENT DE CAPACITE (TABLE WORKING) : WP02-CDSQLD

En cas de message de ce type lors d'une exécution de BQL (par exemple dans K2Y, K22, NJ3, mais surtout NJU, NJN,NJY), ici lors d'une NJU :
*GE01BQL-BBAD0012-DEPASSEMENT DE CAPACITE (TABLE WORKING) : WP02-CDSQLD/000000000000400/000000000000401

C'est sans doute que le programme BQL a utilisé un point de reprise "inopportun".

La table PG50 sert à BQL pour mémoriser son point d'avancement. Ce qui lui permet de reprendre le traitement là ou il été interrompu. La clef de la table est
  • Le code de la chaîne, mais parfois "BQ1'"et "BQ2"
  • Un identifiant sur 8 caractères (IDEJOB en général vide)
  • Un identifiant sur 4 caractères (IDENT4 en général "BQL ")
  • Le code du processus (en général forcé à "*GE01")
  • Le numéro de travail.

Si BQL trouve un enregistrement PA7I il utilisera la PG50 pour savoir ou reprendre le chargement interrompu. Et si la PG50 contient de vieilles données, son comportement peut être imprévisible ...

Pour ne pas avoir de problème lors des exécutions de BQL,
  • Vérifier que le fichier paramètre est vide (sauf en cas de reprise),
  • Sinon supprimez le contenu de la table PG50 pour le numéro de job concerné.

Dans le cas de la NJU la carte est alimentée en standard dans le shell. La seule option est donc la purge ...

EXECBQL :echo "PA7IBQL         00"
FDARCNJY:echo "PA7IBQ1"\
FDARCNJY:echo "PA7IBQ2"\
FDNATNJN:echo "PA7IBQ1         £PQ"\
FDNATNJN:echo "PA7IBQ2         £PQ"\
FDPAYK2Y:echo "PA7IK2Y         £PQ"\
FDXPGK22:echo "PA7IK22         £PQ"\
FDXPGNJ3:echo "PA7INJ3        S£PQ"\
FDXWDNJU:echo "PA7IBQ1         £PQ"\
FDXWDNJU:echo "PA7IBQ2         £PQ"\



10 octobre 2013

Parametre hr_design.time_measure_enabled du fichier dispatcher.properties

Avec HRv7 le paramètre hr_design.time_measure_enabled = true du fichier de paramétrage de OpenHR dispatcher.properties permet d'obtenir dans les fichiers des traces Cobol des messages de début et de fin de transaction.


Receiving (16)  <flag=0>   16 Received -> 16
|BEGIN_TRAN|9109686|2013-10-10 15:19:11,582097000|
Send (5)  <flag=0>.
Receiving (189)  <flag=0>   189 Received -> 189
|RECV|9109686|189|2013-10-10 15:19:11,582221000|-5---------6---------7---------8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
XXXXXXXXXXXXXXXX
OPHR             XD#-
                           41
12345678901234567890123456789012345678901234567890123456789012345678901234567890
LONGUEUR: 189

E:2013-10-10 15:19:11,583844:XXXXXXXX:41
Send (4)  <flag=0>.
|SEND|9109686|4|2013-10-10 15:19:11,587239000|---5---------6---------7---------8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
9100
12345678901234567890123456789012345678901234567890123456789012345678901234567890
LONGUEUR: 4

|END_TRAN|9109686|0.00|2013-10-10 15:19:11,587352000|2013-10-10 15:19:11|
R:2013-10-10 15:19:11,587495:XXXXXXXX:41


Ceci est de peu d'intérêt : les informations sont les mêmes que les RECV et SEND en moins complet (la taille des paquets et les décimales de l'horodatage de fin des END_TRAN y sont absents).

8 octobre 2013

Redirection vers une page d'erreur si Tomcat est fermé

Si vous avez installé un serveur Web de présentation (par exemple Apache) en frontal de votre serveur Web d'application (par exemple Tomcat), vous pouvez indiquer au premier une redirection vers une page d'erreur quand le second est inaccessible.

Ci dessous un exemple de paramétrage Apache (fichier httpd.conf) :

DocumentRoot "/hradev/apache/htdocs"
#
# --------------- Page d'erreur specifique
ErrorDocument  503  /hraccess-indisponible.html

et de page HTML d'indisponibilité :

/hradev/apache/htdocs/hraccess-indisponible.html

<HTML>
<HEAD></HEAD>
<FONT SIZE=5><B>HR ACCESS</B></FONT>
<BR>
<BODY TOPMARGIN=100 LEFTMARGIN=100>
L'accès au portail HRaSpace est temporairement indisponible.<BR>
Merci de votre compréhension.
<BR>
</BODY>
</HTML>