web-dev-qa-db-fra.com

Prendre des captures d'écran en arrière-plan en mode silencieux pour archiver

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:

  • Récapitulez facilement mes pas et gagne aussi
  • Si j'ai de la chance, utilisez directement les captures d'écran de cette archive d'images pour la documentation.

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"
4
J. Doe

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.

enter image description here

enter image description here

enter image description here

Les sons sont arrêtés par les paramètres dconf dans la section son

enter image description here

8
Mogli

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:

  • Il utilise scrot pour prendre des captures d'écran.
  • Il inclut le nom de la fenêtre en cours dans le nom du fichier, ce qui facilite la recherche.
  • Il ne s'exécute pas si l'économiseur d'écran est en cours d'exécution (cela est spécifique à Cinnamon, les autres ordinateurs de bureau nécessiteront une commande différente pour vérifier l'état de l'économiseur d'écran).
  • Il filtre certaines applications dont je ne veux pas faire de captures d'écran, cette liste peut être facilement étendue.
  • Il cesse de prendre des captures d’écran si l’utilisation du disque dépasse 98%.
  • Il utilise puzzle-diff pour ne pas enregistrer une capture d'écran si elle était identique à la précédente (avec une certaine tolérance).
  • Il réduit radicalement la profondeur de couleur des captures d'écran (ou même les rend en niveaux de gris, en fonction de la taille) pour économiser de l'espace disque.
  • J'utilise un disque RAM pour le stockage intermédiaire (avant de décider de conserver ou non une image), mais vous pouvez également utiliser l'emplacement/tmp habituel.

J'utilise un autre script Shell, screenlog, pour l'appeler périodiquement:

#! /bin/bash
while true
do
  sleep 5
  screenlog-capture
done
4
Zoltan

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.

2
DK Bose

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"
1
nobody

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.

1
Simon Richter

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
0
J. Doe

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)

0
Gianlucawork