5

次のような特定のイベントのログを含むログファイルを作成したいと考えています。

  • ノームにログイン
  • ログ画面
  • 画面ロック解除
  • ログアウト

私の計画は、gnome セッションの子プロセスとしてバックグラウンドで実行されるスクリプトを作成することでした。「LOGIN」を追加して開始し、画面のロック/ロック解除を監視し、SIGHUP (セッションが終了したことを意味する) を受信すると「LOGOUT」を追加します。

シェルで起動すると動作するスクリプト [1] を書きましたが、扱いにくいです。このプログラムをバックグラウンドで実行したい -- ログインするたびにプログラムを起動するのを忘れないようにしたい.

誰かが私を正しい方向に向けることができますか?

[1] スクリプト:

#!/bin/bash
# param $1: type, in:
#     ["SCREEN_LOCKED",
#     "SCREEN_UNLOCKED",
#     "LOGIN",
#     "LOGOUT",
#     "SIGINT",
#     "SIGTERM"]
function write_log {
  if [ -z $1 ]; then
    1="unspecified"
  fi
  echo -e "$1\t$(date)" >> "$LOG"
}

function notify {
  echo "$@" >&2
}

function show_usage {
  notify "Usage: $0 login <address> <logfile>"
  notify "Parameters:"
  notify "  login: You must use the string 'login' to avoid seeing this message."
  notify "  <logfile>: File to store logs."
  notify ""
  notify "This script is designed to go in the bashrc file, and be called in the"
  notify "form of: $0 login '$USER@$(uname -n)' >>/path/to/logfile &"
  notify ""
}

if [ "$#" -eq 0 ]; then
  show_usage
  exit 1
fi
if [ "$1" != "login" ]; then
  show_usage
  notify "Error: first parameter must be the string 'login'."
  exit 1
fi
LOG="$2"
if [ -z "$LOG" ]; then
  notify "Error: please specify a logfile."
  exit 1
elif [ -f "$LOG" ]; then
  # If the logfile exists, verify that the last action was a LOGOUT.
  LASTACTION=$(tail -1 "$LOG" | awk '{print $1}')
  if [ $LASTACTION != "LOGOUT" ]; then
    notify "Logfile '$LOG' exists but last action was not logout: $LASTACTION"
    exit 1
  fi
else
  # If the file does not exist, create it.
  touch "$LOG" || ( notify "Cannot create logfile: '$2'" && exit 1 )
fi

# Begin by logging in:
write_log "LOGIN"

# Handle signals by logging:
trap "write_log 'LOGOUT'; exit" SIGHUP
trap "write_log 'INTERRUPTED_SIGINT'; exit 1" SIGINT
trap "write_log 'INTERRUPTED_SIGTERM'; exit 1" SIGTERM

# Monitor gnome for screen locking. Log these events.
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | \
  (
    while true; do
      read X;
      if echo $X | grep "boolean true" &> /dev/null; then
        write_log "SCREEN_LOCKED"
      elif echo $X | grep "boolean false" &> /dev/null; then
        write_log "SCREEN_UNLOCKED"
      fi
    done
  )
4

2 に答える 2

2

私もそのようなスクリプトを持っています.autostartディレクトリのデスクトップファイルでそれを開始するとうまくいきます:

$ cat ~/.config/autostart/watcher.sh.desktop 

[Desktop Entry]
Type=Application
Exec=/home/<username>/hg/programs/system/watcher/watcher.sh
Hidden=false
X-GNOME-Autostart-enabled=true
Name[de_DE]=watcher
Name=watcher
Comment[de_DE]=
Comment=
于 2012-12-18T23:43:02.570 に答える
0

LockedHint最近は、スクリーンセーバーのメッセージよりも、メッセージを聞いた方がよいと思います。そうすれば、スクリーンセーバーの実装に縛られません。

これを行う簡単なスクリプトを次に示します。

gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint

これを与える:

/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <true>}, @as [])
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <false>}, @as [])
于 2018-06-10T23:35:13.500 に答える