Script shell actif mais invisible !

Bonjour à tous.

J’ai créé un petit script shell (timelapse.sh) qui tourne sur une raspbian pour faire des photos /5s de 5h30 à 22h de mon jardin pour faire une vidéo timlapse. Jusqu’ici pas de pb.

je fais : timelapse & —> le script est lancé (actif) et les photos sont prises.

Pourquoi la commande :
ps aux | grep timelapse
ne liste pas le script qui est en fonction (actif) puisque les photos sont biens réalisées toutes les 5s ?
C’était la cas avant que je n’installe motion…

???

K.

Bonjour,

Et avec ps -A, tu le récupères ou pas ?

Non !
$ ps -A PID TTY TIME CMD 1 ? 00:00:05 systemd 2 ? 00:00:00 kthreadd 3 ? 00:00:00 ksoftirqd/0 4 ? 00:00:00 kworker/0:0 5 ? 00:00:00 kworker/0:0H 6 ? 00:00:00 kworker/u2:0 7 ? 00:00:00 kdevtmpfs 8 ? 00:00:00 netns 9 ? 00:00:00 perf 10 ? 00:00:00 khungtaskd 11 ? 00:00:00 writeback 12 ? 00:00:00 crypto 13 ? 00:00:00 bioset 14 ? 00:00:00 kblockd 16 ? 00:00:00 rpciod 17 ? 00:00:00 kswapd0 18 ? 00:00:00 fsnotify_mark 19 ? 00:00:00 nfsiod 28 ? 00:00:00 kthrotld 29 ? 00:00:00 bioset 30 ? 00:00:00 bioset 31 ? 00:00:00 bioset 32 ? 00:00:00 bioset 33 ? 00:00:00 bioset 34 ? 00:00:00 bioset 35 ? 00:00:00 bioset 36 ? 00:00:00 bioset 37 ? 00:00:00 bioset 38 ? 00:00:00 bioset 39 ? 00:00:00 bioset 40 ? 00:00:00 bioset 41 ? 00:00:00 bioset 42 ? 00:00:00 bioset 43 ? 00:00:00 bioset 44 ? 00:00:00 bioset 45 ? 00:00:00 bioset 46 ? 00:00:00 bioset 47 ? 00:00:00 bioset 48 ? 00:00:00 bioset 49 ? 00:00:00 bioset 50 ? 00:00:00 bioset 51 ? 00:00:00 bioset 52 ? 00:00:00 bioset 53 ? 00:00:00 VCHIQ-0 54 ? 00:00:00 VCHIQr-0 55 ? 00:00:00 VCHIQs-0 56 ? 00:00:00 iscsi_eh 57 ? 00:00:00 dwc_otg 58 ? 00:00:00 DWC Notificatio 60 ? 00:00:00 VCHIQka-0 61 ? 00:00:00 SMIO 62 ? 00:00:00 deferwq 63 ? 00:00:00 kworker/u2:2 65 ? 00:00:00 bioset 66 ? 00:00:00 mmcqd/0 67 ? 00:00:00 jbd2/mmcblk0p2- 68 ? 00:00:00 ext4-rsv-conver 69 ? 00:00:00 ipv6_addrconf 84 ? 00:00:00 kworker/0:1H 105 ? 00:00:00 kworker/0:3 113 ? 00:00:00 systemd-journal 115 ? 00:00:00 systemd-udevd 322 ? 00:00:00 cron 325 ? 00:00:00 systemd-logind 331 ? 00:00:00 avahi-daemon 335 ? 00:00:00 dbus-daemon 339 ? 00:00:00 cfg80211 346 ? 00:00:00 avahi-daemon 355 ? 00:00:00 thd 364 ? 00:00:00 rsyslogd 528 ? 00:00:00 dhcpcd 529 ? 00:00:00 sshd 545 ? 00:00:00 ntpd 546 tty1 00:00:00 agetty 547 ? 00:00:00 agetty 553 ? 00:00:00 sshd 559 ? 00:00:00 sshd 561 pts/0 00:00:01 bash 639 pts/0 00:00:00 bash 656 pts/0 00:00:00 scp 657 pts/0 00:00:00 ssh 658 pts/0 00:00:00 ps

Je verrais bien un des 2 process «Bash» qui exécute ton script.
Install «htop» ou tape «top» pour voir tous les process en cours d’exécution

Au passage : “Excellent htop !..”

timelapse.sh (en cours…)
1 #/bin/bash 2 3 # Définition des variables 4 saveDir=/home/pi/script 5 sshDirOrig=/volume1/photo/timelapse 6 sshDirDest=/volume1/home_video/timelapse 7 startHour=53000 # Enregistrement à partir de 5h30. 8 stopHour=223000 # Fin à 22H:30 9 10 # Debug 11 #echo -e "\033[37mDate du jour : \033[32m$currentDate" 12 #echo -e "\033[37mHeure actuelle : \033[32m$currentHour" 13 #echo -e "\033[37mDébut enregistrement : \033[32m$startHour" 14 #echo -e "\033[37mFin enregistrement : \033[32m$stopHour" 15 #echo -e "\033[37mFin enregistrement : \033[32m$sshDirOrig" 16 #echo -e "\033[37mFin enregistrement : \033[32m$sshDirDest" 17 18 # Lancement des commandes sur une boucle infinie 19 while true; do 20 21 currentDate=$(date +%Y_%m_%d) 22 # Mise en place des variables qui permettent de numéroter les pages 23 #typeset -i i 24 #i=1; 25 26 # Création du dossier images du jour s'il n'existe pas déjà 27 ssh -p 2202 admin@kube mkdir -p $sshDirOrig/$currentDate 28 29 # Enregistrement des images du jour 30 while [ $(date +%H%M%S) -ge $startHour ] && [ $(date +%H%M%S) -le $stopHour ]; do 31 fileName=$(date +"%Y%m%d%H%M%S").jpg 32 /opt/vc/bin/raspistill -vf -hf -o $saveDir/$fileName 33 scp -P 2202 $fileName admin@kube:$sshDirOrig/$currentDate 34 rm $fileName 35 sleep 5; 36 done 37 38 # Création du fichier video 39 ssh -p 2202 admin@kube 'cd "\$sshDirOrig/\$currentDate && echo "Déplacement au dossier ..... Ok" && typeset -i i && i=1 && for img in *.jpg; do mv "$img" "${i}.jpg"; i=$i+1; echo $i; done && echo "Renommage numérique ..... Ok"' 40 break; 41 # ssh -p 2202 admin@kube cd $sshDirOrig/$currentDate && echo "Déplacement au dossier ..... Ok" && typeset -i i && i=1 && 42 # for img inls -a | grep jpg`; do
43 # mv $img ${i}.jpg;
44 # i=$i+1;
45 # echo $i;
46 # done && echo “Renommage numérique … Ok”
47 # &&
48 # /usr/bin/ffmpeg -r 15 -start_number 1 -i %d.jpg -s 1920x1080 -vcodec libx264 $currentDate.mp4 && echo “Création du fichier vidéo … Ok” &&
49 # mv $currentDate.mp4 $sshDirDest/$currentDate.mp4 && echo “Déplacement du fichier vidéo … Ok”’
50
51 # ou avec mencoder
52 # Céation du listing
53 # ls *.jpg > list.txt &
54 # Création du fichier vidéo avec mencoder
55 #mencoder -nosound -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=8000000 -vf scale=1920:1080 -o $currentDate.avi -mf type=jpeg:fps=24 mf://@list.txt
56
57
58 # rm -Rf $sshDirOrig
59
60 done;

`

La première ligne censée définir l’interpréteur de commandes est erronée : il manque le “!” après le “#”.

Trop fort : tu as trouvé PascalHambourg !

C’est la première ligne du code erroné qui empêche de voir le script en cours d’exécution.
Merci, je ne le savais pas.

Mais dans ce cas, 2 questions m’interpèlent : Si le script n’est pas visible, il a pourtant l’air d’être fonctionnel, puisque je reçois les images, non ?
N’y-a-t il pas d’option à la commande ps pour voir les scripts fantômes qui sont lancés ?

C’est un coup de chance, je ne pensais pas que les deux avaient un lien. Comme Mimoza je suppose que le script n’était pas invisible mais exécuté par un des processus “bash”. J’imagine qu’en l’absence de définition correcte de l’interpréteur, le script était simplement exécuté dans un sous-shell de l’interpréteur courant, bash.

Au passage, si ce script ne contient aucun “bashisme” (syntaxe non POSIX spécifique à bash), il vaut mieux spécifier l’interpréteur système /bin/sh, qui pointe par défaut vers dash sous Debian. dash est un shell POSIX plus léger (et moins susceptible d’être affecté par des vunérabilités) que bash et plus adapté à l’exécution non interactive de scripts.

Pour ajouter mes deux centimes à l’histoire : on peut parier effectivement qu’un des deux processus bash soit celui exécutant ton script, et que le processus ssh soit également celui lancé par ton script.

Par contre je ne sais pas plus que toi comment “organiser” tout ça, c’est à dire savoir qui appelle qui (script -> bash -> ssh).

Il faudrait utiliser pstree pour afficher l’arborescence des processus, ou afficher le PID du processus parent (PPID) comme le fait ps -Af.

1 J'aime

Merci, je connaissais pas, c’est impec’ :slight_smile:.

Super Merci pour vos réponses.

Avec «htop» on peut aussi afficher l’arborescence des process, il suffit d’appuyer sur «t». :smiley:

2 J'aime

Roy…yal !
Merci Mimoza.

Il est aussi possible de demander à ton script d’afficher (ou de transmettre) lui-même son N° de PID
et/ou de celui de la dernière commande que ce script aurait lancé.

… echo "Le PID de ce script est : " $$ …commandes lancées par le script… echo "Le PID de la dernière commande lancée par ce script est : " $! …

1 J'aime

Excelent : Merci.