#0 -1 » [resolu] extraire fichier plus récent de différents sous-dossier » Le 13/08/2012, à 10:07
- Efhache84
- Réponses : 8
Bonjour à tous et toutes.
Je cherche à réaliser un script bash qui me permettrait de vérifier le contenue d'un dossier (+sous-dossier) et pour chaqu'un extraire le timestamp et le nom du fichier le plus récent.
Je pense que ls -R peut-être la commande de base, mais j'avoue ne pas trop savoir comment me lancer dans l'aventure.
J'avais commencé à réaliser quelquechose en php, mais malheureusement je ne peut faire tourner du php sur la machine que je veux vérifier (et pas non plus moyen d'installer php) conclusion je dois faire cela en bash.
QUelqu'un aurait-il une idée ? une solution ?
Pour info la version php :
<?php
date_default_timezone_set("Europe/Brussels");
$config_file_path = '/home/fabian/NetBeansProjects/auto_check_services/config_checker.ini';
//default value
$base_folder_path = '/home';
$subfolder_exception = '';
$otherfoldertest ='';
$report_csv_path = '/srv/www/htdocs/';
$report_html_path = '/srv/www/htdocs/';
openlog("CheckServicesScript",LOG_CONS | LOG_ODELAY | LOG_PERROR | LOG_PID,LOG_LOCAL0);
/** INIT : read config file and set variables**/
include($config_file_path);
if (isset($base_folder))
{
$base_folder=trim($base_folder);
if (empty($base_folder));
else
{
if(is_dir($base_folder))
$base_folder_path=$base_folder;
else
syslog(LOG_WARNING, "$base_folder is not a directory");
}
}
syslog(LOG_WARNING, "Base Path folder to check is : $base_folder_path");
if (isset($excepted_folder))
$subfolder_exception=$excepted_folder;
$subfolder_exception=trim($subfolder_exception);
if (empty($subfolder_exception));
else
syslog(LOG_WARNING, "Will not check this folder : $subfolder_exception");
if (isset($include_folder))
{
$include_folder=trim($include_folder);
if (empty($include_folder));
else
{
if (is_dir($include_folder))
{
$otherfoldertest=$include_folder;
syslog(LOG_WARNING, "Will also check folders : $otherfoldertest");
}
}
}
if (isset($report_folder))
{
$report_folder=trim($report_folder);
if (empty($report_folder));
else
{
if (is_dir($report_folder))
{
$report_csv_path=$report_folder;
}
}
if($report_csv_path{strlen($report_csv_path)-1}=='/')
{
$report_csv_path{strlen($report_csv_path)-1}=' ';
$report_csv_path=trim($report_csv_path);
}
}
$report_csv_path=$report_csv_path.'/rerport_check_services.csv';
syslog(LOG_WARNING, "CSV report will be saved into:$report_csv_path");
if (isset($html_folder))
{
$html_folder=trim($html_folder);
if (empty($html_folder));
else
{
if (is_dir($html_folder))
{
$report_html_path=$html_folder;
}
}
if($report_html_path{strlen($report_html_path)-1}=='/')
{
$report_html_path{strlen($report_html_path)-1}=' ';
$report_html_path=trim($report_html_path);
}
}
$report_html_path=$report_html_path.'/checkservices.html';
syslog(LOG_WARNING, "HTML report will be saved into:$report_html_path");
//syslog(LOG_WARNING, "$base_folder_path $subfolder_exception $otherfoldertest $report_csv_path $report_html_path");
/** CHECKING : get date of the earlier file in the folder
* and verify that the date is within last two hours
*/
$tab=array();
$j=0;
lister($base_folder_path,$j,$tab,$subfolder_exception);
checktimestamp($tab);
//print_r($tab);
/** REPORT : create report file CSV **/
$reportfilecsv=fopen($report_csv_path, 'a');
fputs($reportfilecsv,"list of folder without data :\n");
for($j=0;$j<count($tab);$j++)
{
if($tab[$j][2]==1)
{
$logmsg=$tab[$j][0].';'.$tab[$j][1]."\n";
syslog(LOG_WARNING, "$logmsg");
fputs($reportfilecsv,$logmsg);
}
}
fclose($reportfilecsv);
/** HTML REPORT : create report table in html **/
/*** FUNCTIONS ***/
function lister($chemin,&$indextab,&$tablist,$direxception )
{
$nom_repertoire = $chemin;
$pointeur = opendir($nom_repertoire);
while ($fichier = readdir($pointeur))
{
if(($fichier != '.') && ($fichier != '..'))
{
if (is_dir($nom_repertoire.'/'.$fichier) && $fichier!=$direxception)
{
$tablist[$indextab][0]="$nom_repertoire/$fichier";
$plusrecent=array(0 => 0, 1 => '' );
$fichiers=glob($tablist[$indextab][0].'/backup');
foreach($fichiers as $fichier2)
{
if(filemtime($fichier2)>$plusrecent[0])
{
$plusrecent=array(0 => filemtime($fichier2), 1 => $fichier2);
$tablist[$indextab][1]=date ("Y-m-d H:i:s",filemtime($fichier2));
$tablist[$indextab][2]=0;
}
}
$indextab++;
}
}
}
closedir($pointeur);
}
function checktimestamp(&$listfolder)
{
$timeRef = date('Y-m-d H:i:s',strtotime('-2 hours')); //reference time is two hours ago
for($j=0;$j<count($listfolder);$j++)
{
$timeDiff = strtotime($timeRef) - strtotime($listfolder[$j][1]);
if($timeDiff>0)
$listfolder[$j][2]=1;
}
}
?>#1 Re : -1 » [resolu] extraire fichier plus récent de différents sous-dossier » Le 13/08/2012, à 10:40
- Efhache84
- Réponses : 8
ok pour le timestamp avec stat ??
sinon la boucle que tu me donnes sembles aussi me lister un sous-sous-repertoire. en php je pourrais virer cela avec un isdir, mais en bash comment filtrer cela?
#2 Re : -1 » [resolu] extraire fichier plus récent de différents sous-dossier » Le 13/08/2012, à 11:02
- Efhache84
- Réponses : 8
ok merci beaucoup.
par contre je me rends compte que je souhaite inverser la recherche. Je souhaiterais les directory qui n'ont pas été modifié endéans x minutes (120 minutes par exemple) est-ce faisable ?
#3 Re : -1 » [resolu] extraire fichier plus récent de différents sous-dossier » Le 13/08/2012, à 11:41
- Efhache84
- Réponses : 8
merci génial !!
#4 -1 » ubuntu 10.04 LTS - root comme unique utilisateur sans mot de passe ? » Le 30/04/2012, à 16:44
- Efhache84
- Réponses : 7
Hello les amis,
j'ai besoin pour une raison particulière d'avoir une ubuntu (10.04) avec un seul unique et utilisateur : ROOT et seulement lui. De plus sans mot de passe, donc avec connexion automatique.
Je sais, cela est mal et dangereux, mais ça m'est imposé, pas le choix.
Comment parvenir à faire ce viol de buntu ? est-ce que supprimer le petit "x" dans le /etc/password et supprimer toute autre etnrée d'utilisateur pourrait régler le problème?
En espérant que vous aurez une idée... :-)
EDIT : userdel et passwd -d m'ont aidé pour ne garder que root sans mot de passe.... maintenant comment faire pour que la machine se log automatiquement sous root... sans que je ne doive cliquer sur "login" et taper l'utilsateur "root" ?
#5 Re : -1 » ubuntu 10.04 LTS - root comme unique utilisateur sans mot de passe ? » Le 02/05/2012, à 12:49
- Efhache84
- Réponses : 7
Si j'ai indiqué cela c'est bel et bien pour éviter d'avoir ce genre de réponse. le choix ne dépend pas de moi. Et accessoirement je n'ai pas à subir d'insulte gratuite...
Est-ce que quelqu'un aurait toutefois une réponse plus utilisable que "con" ?
#6 Re : -1 » ubuntu 10.04 LTS - root comme unique utilisateur sans mot de passe ? » Le 02/05/2012, à 13:11
- Efhache84
- Réponses : 7
J'ai trouvé de moi même la solution... et je l'indique ici à titre informatif... n'en déplaise à certains...
1. en console faire un
sudo passwd -d root pour supprimer le password de root donner par défaut dans ubuntu et qui est inconnu. Le login comme root devient possible, sans mot de passe
2. supprimer les autres utilisateurs de la machine (devenu innutile dans ce cas de figure) : commande userdel
3. ouvrir le fichier /etc/gdm/custom.conf. Eventuellement avec gksudo gedit /etc/gdm/custom.conf pour les utilisateurs d'un environnement graphique
Dans ce fichier indiquer les lignes suivantes :![]()
Redémarrer et voila....
!!!!!!!!!! à vos risques... ça a marché chez moi...
#7 Re : -1 » ubuntu 10.04 LTS - root comme unique utilisateur sans mot de passe ? » Le 02/05/2012, à 13:33
- Efhache84
- Réponses : 7
bien sûr... ![]()
#8 -1 » 11.10 et gnome 3 » Le 23/09/2011, à 14:32
- Efhache84
- Réponses : 5
cela fait un moment que je n'ai plus suivi l'évolution d'ubuntu... (pire je n'ai plus suivi l'évolution de linux... ouch)
je me remets à jour et lors de mes petites recherche, je constate que la 11.04 a adopté un environnement de bureau appéllé Unity et non plus gnome comme précémdent.
Est-ce que gnome est abandonné dans les versions ubuntu désormais ? La prochaine version n'adoptera pas le gnome 3?
#9 Re : -1 » 11.10 et gnome 3 » Le 23/09/2011, à 15:21
- Efhache84
- Réponses : 5
j'ai en effet regardé un peu Unity et je pense que je vais me cataloguer dans "ceux qui n'aiment pas", un environnement netbook like ne me plait pas sur qqch qui n'est pas un gadget. Mais ça n'engage que moi.
Par contre je trouve dommage qu'ubuntu abandonne gnome comme ça... je préférais la "séparation" Kubuntu avec KDE, ubuntu gnome et xubuntu xfce... mais bon... au pire si vraiment rester sous ubuntu est pénible avec unity il y a moyen de changer aussi.
Merci pour les éclaircissements en tout cas ![]()
#10 -1 » Bash script redémarant des process qui meurent » Le 16/06/2011, à 15:47
- Efhache84
- Réponses : 22
Bonjour à tous, j'ai une petite question, je désire faire un script (bash pcq c'est le scripting dispo) qui permettrait de s'assurer qu'une série de process tournent et si jamais l'un d'eux meurt (ou plusieurs) il exécute une série de commande (en réalité d'autres scripts qui permettent de redémarrer les process et de faire une série de test avant redémarage)
J'ai bien une idée de solution avec quelque chose du genre
until myprocess; do
echo "Process 'myprocess' stopped with exit code $?. Respawning.." >&2
sleep 1
doneMais le désavantage c'est que ça ne fait le suivi que d'un seul et unique process. Je me vois mal faire autant de script que de process à suivre.
Je suis sûr que la solution est idiote, peut-être avec des test et des ou logique. Mais je ne sais comment écrire mon bash pour le faire...
Je bloque sur une bêtise ainsi...
Si quelqu'un peut m'apporter de l'aide, ce serait sympa ![]()
EDIT : oui j'ai oublié de dire que avantageusement le unitll loop permet de pas relancer le process si jamais il termine normalement donc sie le retour est 0
#11 Re : -1 » Bash script redémarant des process qui meurent » Le 16/06/2011, à 17:22
- Efhache84
- Réponses : 22
Ok je suis peut-être idiot, mais pourquoi mettre ":;" après le while?
cela réalise une sorte de "true" ?
Et sinon probablement qu'il vaut mieux que j'ajoute un sleep d'une dizaine de seconde pour être sûr qu'il ne tourne pas comme un malade dans le script et ainsi être sûr qu'il ne bouffe pas le cpu, non?
EDIT : par contre pgrep n'est pas disponnible, donc je vais utiliser un ps | grep avec un cut ou qqch du genre.
Merci pour la piste, je vais essayer ça
#12 Re : -1 » Bash script redémarant des process qui meurent » Le 17/06/2011, à 09:32
- Efhache84
- Réponses : 22
Juste une petite aide encore avec mon remplacement de pgrep...
imaginons un process qui s'appelle webcommanager.
ps | grep webcommanagerme renvoit
root@ptxblackbox:~ ps | grep webcommanager
159 root 7684 R ./webcommanager
172 root 7684 S ./webcommanager
174 root 7684 S ./webcommanager
447 root 2052 S grep webcommanagersi je complète avec un cut et quelques infos... j'obtiens juste le nom... malheureusement plusieurs fois puisque ps répertorie chaque threat de ce process ainsi que l'utilisation de grep
ainsi
ps | grep webcommanager | cut -d'/' -f2me donne presque ce que je désire :
root@ptxblackbox:~ ps | grep webcommanager | cut -d'/' -f2
webcommanager
webcommanager
webcommanager
454 root 2052 S grep webcommanagermais maitenant comment faire pour n'obtenir que la première ligne de ce résultat ? puisque je cherche à remplacer pgrep...
#13 Re : -1 » Bash script redémarant des process qui meurent » Le 17/06/2011, à 11:32
- Efhache84
- Réponses : 22
ah je ne connaissais pas awk, voila qqch de nouveau. merci beaucoup ;-)
#14 Re : -1 » Bash script redémarant des process qui meurent » Le 17/06/2011, à 11:41
- Efhache84
- Réponses : 22
sans doute ai-je fait une bêtise mais le comportement du script est assez étonnant
cd /pcsfolder
plist="[w]ebcommanager [l]cddrive"
while :; do
for proc in $plist; do
ps | awk 'BEGIN { FS="/" } /'"$proc"'/ { print $2 ; exit }' || {
echo "Respawning $proc"
eval "$proc"
}
done
sleep 10
doneet à l'éxécution du script j'obtiens :
root@ptxblackbox:~ ./watchdog_script
}
}donc une accolade apparaissant toutes les 10 secondes, mais aucun des process n'est démarré... je ne suis pas spécialiste du script bash donc il y a sûrement une erreur dans ce que j'ai écrit mais je ne la trouve pas.
#15 Re : -1 » Bash script redémarant des process qui meurent » Le 17/06/2011, à 16:20
- Efhache84
- Réponses : 22
(...)
cd /pcsfolder plist="webcommanager lcddrive" while :; do # peut être pas besoin de lancer un ps pour chaque exe à checker ? data_ps=$(ps) for proc in ${plist}; do if ! grep -q /${proc} <<< "${data_ps}"; then #pas besoin de eval ! Et les commandes ne devraient pas être lancé en arrière plan ? ${proc} & fi done sleep 10 done
Elle seront lancé tel quel
start-stop-daemon -S -b -x ./webcommanager(...)
EDIT3:
pfff, j'en ai des choses à dire
Je connais pas tes softs, mais si ils gardent la main, et que tu veux qu'il tournent tous le temps, pourquoi ne pas faire simplement un script qui lance tes commandes dès le départ, et les relancer dès qu'elle rendent la main. Au besoin, créer un fichier dans tmp pour arrêter la boucle.
Il n'y aura aucune commande ou autre sleep.
genre:Webcom() { webcommanager Webcom } Lcddrive() { lcddrive Lcddrive } Webcom & Lcddrive &
Actuellement un script pour les lancer contient une série de start-stop-daemon comme montré ci-dessus.
Jusque là tout va bien, mais je veux me prémunir contre les arrêts éventuels de process. Donc ici l'idée serait de toujours les lancer par un script mais de faire une sorte de monitoring qui va vérifier qu'ils sont toujours actif comme process et sinon les relancer.
Eventuellement par une tâche cron... comme autre option ?
J'en suis aux essais et réflexion pour l'instant. L'idée est d'essayer de faire ça avec une souplesse script et de ne pas s'amuser à écrire un soft watchdog...
Donc je suis ouvert à toute idée.
#16 Re : -1 » Bash script redémarant des process qui meurent » Le 20/06/2011, à 09:01
- Efhache84
- Réponses : 22
Petites précisions.
Actuellement je possède un script qui ne fait que lancer une série d'éxécutable (process écrit en C), ils sont lancés comme décrit ci-dessus.
La liste des process à lancer (et qui restent actifs) peut varier au cours du temps. (il peut y en avoir plus ou moins donc)
En fait je veux simplement m'assurer avec une solution simple et flexible que les process tournent et si l'un d'eux ne tourne plus qu'il soit simplement relancé (ou si cela est finalement plus simple, si l'un d'eux meurt, on coupe tout et on relance toute la lsite de process)
#17 Re : -1 » Bash script redémarant des process qui meurent » Le 20/06/2011, à 12:24
- Efhache84
- Réponses : 22
Efhache84 a écrit :lancer une série d'éxécutable
Oui mais..... Combien ? En moyenne ? ...2 ? ...20 ? ...200 ?
une quinzaine
en effet ce n'est pas un script qu'il faut surveiller mais bien les process qui sont lancés.
maintenant peut-être que je me trompe en imaginant que ce serait surveillable par script
#18 -1 » interface réseau innutilisable après transfert machine » Le 23/02/2011, à 12:09
- Efhache84
- Réponses : 3
Bonjour à tous et toutes,
petit problème particulier... je dispose de deux serveurs identiques (si ce n'est que l'un a plus de ram que l'autre).
J'ai dû transférer le disque hotspare d'une machine vers l'autre tout fonctionne parfaitement à l'exception que je ne possède plus de réseau
ifconfig ne propose que la connexion lo, et un ifconfig eth0 up ou eth1 up renvoie un message d'erreur contenant "no such device"
la machine tourne avec une 10.0.4.1 (dernière LTS)
est-ce qu'il y aurait une commande utilisable pour refaire une détection des interfaces réseaux comme en open suze?
Merci
#19 Re : -1 » interface réseau innutilisable après transfert machine » Le 24/02/2011, à 12:14
- Efhache84
- Réponses : 3
ok merci en effet c'était ça... je m'étonne qu'aucun message signalant une incohérence entre ce qu'il a retenu et ce qu'il voit n'apparait lorsque l'on tente de relancer l'interface réseau et/ou lorsque l'on démare...
je présume que dans le X un message serait apparu mais en console... :-/
#20 -1 » [ok]comment utiliser l'utilisateur root sans connaître le mot de passe » Le 29/11/2010, à 10:22
- Efhache84
- Réponses : 9
Par défaut l'utilisateur root n'est pas "installé" sur le serveur, dans le sens où il faut passer par des commandes sudo pour pouvoir en récupérer ses privilèges.
Mais dans mon cas précis j'ai besoin d'un utilisateur root à part entière. Avant de tenter à l'aveuglette et de foutre le b*rdel, je passe par la case forum.
Comment faire pour récupérer le root user ? Suffit-t-il de changer son mot de passer avec une commande du style
sudo passwd root?
#21 Re : -1 » [ok]comment utiliser l'utilisateur root sans connaître le mot de passe » Le 29/11/2010, à 11:07
- Efhache84
- Réponses : 9
pour mon titre je t'assure que si : je ne connais pas le mot de passe de root. Je connais uniqueemnt le mien qui me permet grâce à "sudo" de prendre les droits de root.
Pour sudo su, je suis d'accord. Mais dans mon cas j'ai besoin de me connecter en tant que root.
#22 Re : -1 » [ok]comment utiliser l'utilisateur root sans connaître le mot de passe » Le 29/11/2010, à 11:27
- Efhache84
- Réponses : 9
De toute façon il s'agit d'un ubuntu server sans GUI, mais donc confirmation qu'il suffit d'y affecter un mot de passe.
Merci
#23 Re : -1 » [ok]comment utiliser l'utilisateur root sans connaître le mot de passe » Le 29/11/2010, à 12:01
- Efhache84
- Réponses : 9
je suis bien d'accord mais dans le cas présent, l'utilisateur root est requis ;-)
#24 Re : -1 » convertisseur USB<->RS-232 » Le 29/11/2010, à 10:04
- Efhache84
- Réponses : 8
Ah oui désolé j'ai oublié de préciser cette astuce. Mais un coup de dmesg après connexion du convertisseur faisait apparaître le bon device file