Bonjour.
J'ai un problème avec un Script permettant d'effectuer un diff entre deux fichiers générés automatiquement par un système.
Le but étant d'automatiser le diff chaque jour entre le fichier du jour J et J-1.
Dans le nom du fichier la date y figure sous la forme yyyymmdd.
Voici le script.
#!/bin/sh
nomfic1=$(date --date '1 days ago' '+%Y%m%d')'Filter.txt'
echo "$nomfic1"
nomfic2=$(date --date '2 days ago' '+%Y%m%d')'Filter.txt'
echo "$nomfic2"
nomfic3=$(date --date '1 days ago' '+%Y%m%d')'DifFilter.txt'
echo "$nomfic3"
diff /home/$nomfic1 /home/$nomfic2 >> /home/$nomfic3
Les commandes echo sont présentes pour vérification des variables uniquement. Le problème étant sur le DIFF j'ai un retour du type :
: Aucun fichier ou dossier de ce type
: Aucun fichier ou dossier de ce type
Sachant que quand je suis dans mon shell: les commandes passées à la main fonctionnent.
J 'ai essayé plusieurs variante avec " avant et après le chemin du fichier: le résultat est le même.
Merci de votre aide.
# Il faut plus de détails
Posté par MicP . Évalué à 1. Dernière modification le 07 septembre 2022 à 15:46.
Bonjour
Il faudrait nous dire ce que tu as tenté de faire pour que ton script puisse être automatiquement lancé tous les jours <=> quel est le programme qui lance le script et quelle est la directive exacte qui permet de déclencher l'exécution du script, et quel est le nom et le chemin absolu du script.
(j'ai bien une petite idée de ce que tu aurais pu faire, mais j'ai besoin d'une confirmation détaillée de ce que tu as fait car tu pourrais avoir oublié de préciser quelques détails importants dans cette directive)
Je suppose que le
jour J
est le jour précédant le jour où le script sera lancé.diff /home/$nomfic1 /home/$nomfic2 >> /home/$nomfic3
Je suis très surpris que ces fichiers soient dans le répertoire
/home/
…… et que cette ligne de commande puisse fonctionner telle quelle en n'utilisant que les privilèges de ton compte utilisateur non privilégié.
Tu as peut-être oublié de spécifier dans les noms de chemin de ces fichiers le nom du compte utilisateur :
comme par exemple
scriptnew
qui serait utilisé pour nommer le sous-répertoire du répertoire/home/
qui servirait alors de répertoire personnel au compte utilisateurscriptnew
ce qui donnerait :
/home/scriptnew/
[^] # Re: Il faut plus de détails
Posté par Scriptnew . Évalué à 1.
Bonjour
Le chemin est bien /home/scriptnew
La méthode envisagée pour le lancement automatique est une tâche crontab. Mais je n en suis pas encore là, le script ne fonctionnant pas en l exécutant.
Merci.
[^] # Re: Il faut plus de détails
Posté par ChocolatineFlying . Évalué à 1.
si je comprend bien son commentaire il voulait pointer que :
diff /home/$nomfic1 /home/$nomfic2 >> /home/$nomfic3
c'est vachement différent de
diff /home/scriptnew/$nomfic1 /home/scriptnew/$nomfic2 >> /home/scriptnew/$nomfic3
toi tu travail direct dans /home, c'est peut être ton choix
# Bash ?
Posté par gUI (Mastodon) . Évalué à 2. Dernière modification le 07 septembre 2022 à 16:07.
Tu dis que ça passe à la main, mais sous quel shell es-tu à la main ?
Au lieu de
#!/bin/sh
as-tu essayé avec#!/bin/bash
?En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
[^] # Re: Bash ?
Posté par MicP . Évalué à 1. Dernière modification le 07 septembre 2022 à 17:19.
Non : ce n'est pas un problème de choix de shell utilisé
Car les commandes utilisées dans ce script fonctionneraient tout aussi bien avec les deux shells (
bash
etsh
) si la liste des chemins assignée à la variablePATH
en permettait l'accès et si les privilèges du compte utilisateur qui avait lancé ce script lui permettait d'accéder en écriture dans le répertoire/home/
Donc, ça dépend surtout de la méthode qui a été utilisée pour que ce script soit automatiquement lancé car cela permettra de savoir avec quels privilège ce script sera lancé et quelle sera la liste des chemins qui sera assignée à la variable
PATH
dans l'environnement d'exécution de ce script.(et si le premier caractère contenu dans ce script a été enlevé)
[^] # Re: Bash ?
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 2.
Si, si… Si tu lances des commandes avec des bashismes, un interpréteur que POSIX peut se comporter différementsurr un certain nombre de détails. La première ligne, de shebang, indique l'interpréteur du script, et sauf s'il s'agit de lien, rien ne te dit que le shell n'est pas en cause (un
echo $SHELL
te dira celui que tu utilises intéractivement.)Les chemins sont un autre (second souci) et
echo $PATH
devrait t'indiquer les chemin recherchés. Les fichiers d'initialisation du shell intercatif en indique un certain nombre qui ne sont pas ceux, plus réduits, ducron
(mais on peut paramétrer aussi cela au début du fichier de crontab)“It is seldom that liberty of any kind is lost all at once.” ― David Hume
# Si ton script est lancé par une tâche crontab
Posté par MicP . Évalué à 1. Dernière modification le 07 septembre 2022 à 19:18.
crontab
créée depuis ton compte utilisateur pour lancer ce script.txt
utilisés dans ce script sont dans le répertoire personnel de ton compte utilisateuralors :
.txt
utilisés dans ce script car le répertoire courant par défaut utilisé lors de l'exécution de ce script sera le répertoire personnel de ton compte utilisateur/usr/bin
est déjà dans la liste des chemins assignée à la variablePATH
Voilà le contenu du script modifié (et sans le caractère
S
qui était juste avant le shebang)qui sera lancé par la tâche crontab :
$HOME
) dans la ligne de commande de la tâche crontab.À la suite de la commande dans la ligne crontab, tu pourrais ajouter une redirection de STDERR vers un fichier log, au cas où quelque chose ne se serait pas bien passé dans le script.
Si tu as utilisé une autre méthode pour lancer ce script,
il faudra le préciser, car autre contexte => autres contraintes.
[^] # Re: Si ton script est lancé par une tâche crontab
Posté par MicP . Évalué à 1. Dernière modification le 07 septembre 2022 à 19:24.
Correction :
à remplacer par :
[^] # Re: Si ton script est lancé par une tâche crontab
Posté par Scriptnew . Évalué à 1. Dernière modification le 07 septembre 2022 à 23:01.
Bonjour,
Merci pour ta réponse.
Le script sera bien planifié chaque jour grâce à une tâche crontab.
Mais je n en suis pas encore là. Le script ne fonctionnant pas en l executant depuis le prompt je ne suis pas passé à cron.
Je vais essayé de suivre ta réponse.
Merci.
p.s. Le S devant le shebang est une faute de frappe à la recopie du script dans le forum.
[^] # Re: Si ton script est lancé par une tâche crontab
Posté par MicP . Évalué à 1. Dernière modification le 08 septembre 2022 à 10:33.
Bonjour
Si le script
/home/scriptnew/monscript.sh
contient :
et si ce script est exécutable pour le compte utilisateur
scriptnew
et si il existe les fichiers
20220906Filter.txt
et20220907Filter.txt
dans le répertoire personnel du compte utilisateurscriptnew
alors, si la session du compte utilisateur
scriptnew
est ouverte à ce moment làle 9 septembre à 10:00 le fichier
/home/scriptnew/20220909DifFilter.txt
sera crééet tous les jours à 10 heures si les fichiers dont le contenu à différencier existent
alors un nouveau fichier
/home/scriptnew/yyyymmddDifFilter.txt sera créé
(bien sûr, avec
yyyymmdd
correspondant à la date du jour)[^] # Re: Si ton script est lancé par une tâche crontab
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 2.
versus
Je verrais plutôt, avec dash,
“It is seldom that liberty of any kind is lost all at once.” ― David Hume
[^] # Re: Si ton script est lancé par une tâche crontab
Posté par MicP . Évalué à 1. Dernière modification le 09 septembre 2022 à 00:00.
Ce n'est pas nécessaire de préciser le chemin du répertoire personnel du compte utilisateur
puisque le chemin courant sera celui du répertoire personnel du compte utilisateur.
Voici le retour de la commande
env
quand elle est lancée depuis le script qui est lui même lancé par la tâchecrontab
:Mais si tu veux utiliser le tilde pour indiquer le répertoire personnel du compte utilisateur, il faudra le faire suivre d'un caractère slash s'il doit être suivit d'autre chose
[^] # Re: Si ton script est lancé par une tâche crontab
Posté par MicP . Évalué à 1.
Rhââââ,
je voulais corriger la dernière ligne et la remplacer par :
[^] # Re: Si ton script est lancé par une tâche crontab
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 2.
Oui :-) Je l'ai précisé parce-que ce n'est pas clair pour moi que le script est exécuté avec le dit compte (aussi bien pendant les tests interactifs que par cron)
“It is seldom that liberty of any kind is lost all at once.” ― David Hume
[^] # Re: Si ton script est lancé par une tâche crontab
Posté par gUI (Mastodon) . Évalué à 3.
J'ai corrigé
En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
[^] # Re: Si ton script est lancé par une tâche crontab
Posté par MicP . Évalué à 1.
Arghh! : j'avais essayé d'adapter les copiés/collés,
mais je vois que j'ai oublié de changer le nom du répertoire dans un des copiés/collés retournés dans mon dernier message.
Mais je ne peux plus éditer mon dernier message
dans lequel il faudrait changer :
par :
Merci.
[^] # Re: Si ton script est lancé par une tâche crontab
Posté par gUI (Mastodon) . Évalué à 4.
Fait !
En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
[^] # Re: Si ton script est lancé par une tâche crontab
Posté par MicP . Évalué à 1. Dernière modification le 08 septembre 2022 à 10:26.
Merci beaucoup :)
[^] # Re: Si ton script est lancé par une tâche crontab
Posté par gUI (Mastodon) . Évalué à 4.
D'ailleurs je viens même de corriger la correction : un seul
n
àscriptnew
dans le chemin, on est d'accord ?En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
[^] # Re: Si ton script est lancé par une tâche crontab
Posté par MicP . Évalué à 2. Dernière modification le 08 septembre 2022 à 11:27.
Oh que oui, j'étais d'ailleurs bien embêté quand je m'en suis apperçu… trop tard.
(il y avait déjà bien AC2N)
Merci encore.
# systemd
Posté par MicP . Évalué à 0.
En fonction de la distribution Linux que tu utilises
il vaudrait peut-être mieux utiliser systemd pour ce genre de tâche journalière.
Voir : archlinux -> systemd (Français)/Timers (Français)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.