Pendant mon travail, je teste souvent des outils de complexité différente et développe des scénarios d'utilisation et d'intégration.
J'utilise Ubuntu 18.04 LTS.
Parfois, si les choses se compliquent vraiment, je ne suis pas toujours sûr de savoir comment je suis parvenu à la solution, et pour des raisons de documentation et de partage des connaissances, je passe plus de temps à prendre conscience d'une manière nette et propre avec moins déconner, prendre des screenshots et ainsi de suite.
Ensuite, j'ai pensé qu'il serait intéressant de disposer d'un outil de capture d'écran pour prendre une photo, par exemple toutes les 30 secondes en arrière-plan de manière silencieuse afin que je puisse:
Je pensais par exemple que je configurerais un travail cron pour le déclencheur, mais alors que je l'utilise déjà, il y a une erreur "vous avez déjà une instance de déclencheur en cours d'exécution". Je vais essayer maintenant avec scrot.
De meilleures idées?
UPDATE: pour l'exécution gérée par Cron, cet outil ne pouvant pas résoudre les intervalles de temps inférieurs à une minute, voici un solution (une des réponses les moins notées dans le fil) toutes les 30 secondes.
* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"
Je viens de commencer à apprendre Ubuntu.
Je ne sais pas si cette méthode est appropriée ou non.
Je pourrais le réaliser de la manière suivante.
J'ai créé un script comme celui-ci nommé ScreenShot.sh dans le dossier/usr/local/bin
#!/bin/bash
# NAME: ScreenShot.sh
# PATH: /usr/local/bin
# DESC: Take Screenshots at every specified intervals with "watch -n 10 ScreenShot.sh" Command
# DATE: Oct 12th 2018
Sudo gnome-screenshot -d 0
Sudo chmod a+x /usr/local/bin/ScreenShot.sh
quand je lance le système et que je voulais lancer la capture d'écran toutes les 10 secondes,
je lance cette commande
Sudo watch -n 10 ScreenShot.sh
j'ai configuré mon dossier par défaut, le type d'image à enregistrer, avec l'éditeur dconf dans la section gnome-screenshot
.
Les sons sont arrêtés par les paramètres dconf dans la section son
Je fais la même chose. Voici le script que j'ai écrit, appelé screenlog-capture
:
#! /bin/bash
window_name() {
xwininfo -id "$1" | \
grep "^xwininfo: Window id" | \
LC_CTYPE=C LC_COLLATE=C sed 's/^[^"]*"\(.*\)"$/\1/' | \
sanitize-filename
}
window_class() {
xprop -id "$1" | grep "^WM_CLASS(STRING)" | cut -d '"' -f 4
# Or we could use _NET_WM_PID(CARDINAL) -> process name
}
if [ ! -d "$RAMTMP" ]
then
echo "RAMTMP needs to be set."
exit 1
fi
if [ ! -e /usr/bin/puzzle-diff ]
then
echo 'Error: puzzle-diff not installed!'
exit 1
fi
rootdir="$HOME/screenlog"
if [ ! -w "$rootdir" ]
then
echo 'Error: screenlog dir not writable'
exit 1
fi
if [[ $(qdbus org.cinnamon.ScreenSaver /org/cinnamon/ScreenSaver org.cinnamon.ScreenSaver.GetActive) == true ]]
then
exit
fi
du=$(df -Plh "$rootdir" | sed -n -e '2s/.* \([0-9]\+\)% .*/\1/' -e '2p')
if [ "$du" -ge 98 ]
then
exit
fi
win_id=$(xprop -root | grep "^_NET_ACTIVE_WINDOW(WINDOW)" | cut -d ' ' -f 5)
win_name=$(window_name "$win_id")
parent_id=$(xprop -id "$win_id" | grep "^WM_TRANSIENT_FOR(WINDOW)" | cut -d ' ' -f 5)
if [ "$parent_id" ]
then
win_class=$(window_class "$parent_id")
else
win_class=$(window_class "$win_id")
fi
case "$win_class" in
# Firefox-bin is full-screen YouTube video (for example)
Gq|Geeqie|GQview|Firefox-bin|Plugin-container|Gimp|mplayer2)
exit
;;
esac
case "$win_name" in
*'Internet Bank'*|*'YouTube'*|MPlayer|Netflix*|Prime\ Video*)
exit
;;
esac
tmpfilename="$RAMTMP/screenlog-capture.png"
scrot -buq 0 "$tmpfilename"
if [ ! -s "$tmpfilename" ]
then
exit
fi
if [ $(stat -c %s "$tmpfilename") -lt 500000 ]
then
mogrify -depth 3 "$tmpfilename"
else
mogrify -type Grayscale -depth 3 "$tmpfilename"
fi
latest="$rootdir/latest.png"
puzzle-diff -c -e -E 0.1 "$latest" "$tmpfilename" &>/dev/null
if [ $? -eq 10 ]
then
# No relevant changes, don't keep screenshot
rm "$tmpfilename"
else
win_name="$(printf %.30s $win_class) - $(printf %.60s $win_name)"
date=$(date '+%Y-%m/%Y-%m-%d')
dirname="$rootdir/$date"
mkdir -p "$dirname"
filename="$dirname/$(date '+%H.%M.%S') $win_name.png"
mv "$tmpfilename" "$filename"
rm -f "$latest"
ln -s "$filename" "$latest"
fi
Certaines des fonctionnalités intéressantes:
scrot
pour prendre des captures d'écran.puzzle-diff
pour ne pas enregistrer une capture d'écran si elle était identique à la précédente (avec une certaine tolérance).J'utilise un autre script Shell, screenlog
, pour l'appeler périodiquement:
#! /bin/bash
while true
do
sleep 5
screenlog-capture
done
Je suis venu avec
#! /usr/bin/env bash
sleep_period=30s
while true; do
scrot $HOME/Pictures/"$(date +%Y%m%d%H%M%S)".png
sleep ${sleep_period}
done
J'ai ~/bin
et j'ai donc sauvegardé ce script sous le nom continuous-scrot.sh
et l'ai rendu exécutable. Pour l’exécuter, j’ouvre une fenêtre de terminal, tape le nom du script et appuie sur Enter. Je laisse cette fenêtre de terminal active et les captures d'écran en plein écran sont capturées toutes les 30 secondes dans votre dossier ~/Pictures
. Pour arrêter, retournez à la fenêtre du terminal et appuyez sur Ctrl+C.
Comme j'ai beaucoup de distributions Linux sur lesquelles j'ai besoin de captures d'écran, et qu'ils utilisent divers gestionnaires de fenêtres, j'utilise probablement le plus ancien des utilitaires de capture d'écran xwd. Il fait partie de la distribution XServer, je peux donc être sûr qu'il est installé à chaque fois. Je ne sais pas s'il est distribué et s'il fonctionne avec Wayland. La commande
xwd -display :0.0 -root -out screenshot.xwd
devrait faire une capture d'écran de la fenêtre racine de l'affichage: 0.0. Le fichier de sortie est un fichier de vidage spécialement formaté. ImageMagick peut convertir ce fichier dans un format plus courant. Pour plus d'informations: https://linux.die.net/man/1/xwd .
Vous pouvez trouver de nombreuses idées sur la manière d'exécuter cet utilitaire à intervalles réguliers dans d'autres réponses. Pour créer une sortie dans un fichier différent chaque fois que vous le pouvez:
xwd -display :0.0 -root -out "$(date).xwd"
J'utiliserais recordmydesktop
, éventuellement avec un faible débit en fps et sans audio pour réduire la quantité de données enregistrées.
Bien que ce ne soient pas exactement des captures d'écran, mais une vidéo complète, l'avantage est que vous obtenez une bonne compression, car seules les différences entre les images consécutives doivent être enregistrées. Vous avez également la possibilité d'enregistrer votre microphone afin que vous puissiez prendre des notes en parlant. pouvez éventuellement ajouter des boutons marche/arrêt à la zone de notification du système.
Comment j'ai résolu cela pour moi-même:
Commencez par installer le travail suivant:
* * * * * DISPLAY=:0 /usr/bin/Sudo -i -u <USER> bash -c '/home/<USER>/bin/create-screenshot.sh; sleep 30; /home/<USER>/bin/create-screenshot.sh;'
Remarquez l'instruction DISPLAY=:0
pour permettre à cron d'accéder au serveur X.
Ensuite, créez ~/bin/create-screenshot.sh
avec le contenu suivant:
#!/bin/bash
user="<USER>"
folder="$(date +%Y%m%d)"
y="$(date +%Y)"
m="$(date +%m)"
mkdir -p "/home/$user/screenshots/$y/$m/$folder"
file="$(date +%Y%m%d%H%M%S)".png
path="/home/$user/screenshots/$y/$m/$folder/$file"
scrot $path
La première chose à laquelle je peux penser est d’ouvrir un terminal et de l’utiliser pour émettre un scrot dans un instant. Quelque chose comme ça:
while sleep 30; do scrot <whatever>; done
Pour moi, il y a un problème dans cela. Et si vous faites quelque chose de significatif entre les 30 secondes? Avez-vous envisagé un enregistreur d'écran (SimpleScreenRecorder est disponible sur la distribution Ubuntu? Un autre nom dont je me souviens est Istanbul)