【问题标题】:How to Detect workstation/System Screen Lock in ubuntu using java?如何使用 java 在 ubuntu 中检测工作站/系统屏幕锁定?
【发布时间】:2012-01-18 06:47:27
【问题描述】:

我正在尝试记下在 ubuntu 操作系统中工作的每个员工的工作站/系统屏幕锁定。我需要将这些记录存储在数据库中。使用 JAVA。我已经到处搜索并想到了 UBUNTU;但是知道如何在 Windows 操作系统中做同样的事情。

【问题讨论】:

    标签: java ubuntu


    【解决方案1】:

    来自here

    gnome-screensaver-command -q | grep "is active"
    

    使用Runtime 类执行该命令并读回结果。

    编辑:使用grep -q

    这里是一个如何使用它的例子:

    public class ScreenSaver {
    
      /*
       * Pipes are a shell feature, so you have to open a shell first.
       * 
       * You could use process.getInputStream() to read the output and parse it.
       * 
       * For productive use i would prefer using the Inputstream.
       */
    
      private static final String COMMAND = "gnome-screensaver-command -q |  grep -q 'is active'";
    
      private static final String[] OPEN_SHELL = { "/bin/sh", "-c", COMMAND };
    
      private static final int EXPECTED_EXIT_CODE = 0;
    
    
      public static boolean isScreenSaverActive() {
        final Runtime runtime = Runtime.getRuntime();
        Process process = null;
        try {
          /*
           * open a shell and execute the command in that shell
           */
          process = runtime.exec(OPEN_SHELL);
          /*
           * wait for the command to finish
           */
          return process.waitFor() == EXPECTED_EXIT_CODE;
        } catch(final IOException e) {
          e.printStackTrace();
        } catch(final InterruptedException e) {
          e.printStackTrace();
        }
        return false;
      }
    
    
      public static void main(final String[] args) {
        System.out.println("Screensaver is active: " + isScreenSaverActive());
      }
    
    }
    

    编辑:添加了观察 dbus 信号的 perl 脚本。来源: Gnome Screensaver FAQ

    #!/usr/bin/perl
    
    my $cmd = "dbus-monitor --session \"type='signal',interface='org.gnome.ScreenSaver',member='ActiveChanged'\"";
    
    open (IN, "$cmd |");
    
    while (<IN>) {
        if (m/^\s+boolean true/) {
            print "*** Screensaver is active ***\n";
        } elsif (m/^\s+boolean false/) {
            print "*** Screensaver is no longer active ***\n";
        }
    }
    

    【讨论】:

    • 感谢您的代码正常运行,但我将您的代码写在 java 代码中并将其打包为 .jar 文件以运行。如果我锁定或解锁屏幕我需要运行这个文件怎么做。我想通过 viki.omega9 先生指示的代码监控屏幕保护程序并运行我的 jar 文件,但它给出了语法错误。我在评论他的回答时提到过。
    • 我也有与您提供的类似类型的代码。 我现在需要的是让这个 jar 文件仅在屏幕锁定和解锁时执行。
    • 所以你需要像在屏幕被锁定/解锁时监听一个事件然后执行 jar 文件?请澄清,我真的不明白你想要完成什么。
    • 脚本是用perl写的,不是shell脚本!
    【解决方案2】:

    试试看这里,(类似重复),Detect workstation/System Screen Lock using Python(ubuntu))

    GNOME Screensaver FAQ 这应该是一个很棒的参考资料,可以帮助您快速上手。我想你正在使用 GNOME。

    【讨论】:

    • 我已经看过这些网站,但在终端中运行时出现语法错误。由于我是 Linux 新手,我无法调试这些语法错误。我得到这个错误**/home/sathishkumarkk/Desktop/userinfo.sh: 2: my: not found /home/sathishkumarkk/Desktop/userinfo.sh: 4: Syntax error: word unexpected (expecting ")")**
    • 您应该粘贴整个脚本,因为没有人可以在不查看代码的情况下调试您的错误。使用 paste.org 并显示您的代码。
    • 这是我在终端中运行的 shell 脚本。 My shell script inside .sh file
    • 我认为,如果您可以先提高一下您的 bash 脚本技能,那将是一个好主意。第二行中最明显的错误是“my $cmd”,这是错误的,应该是“$cmd”。
    • 我已经通过删除my进行了检查,后来它显示= 没有找到,那么第二行的错误呢?一位回答者@ ortang 告诉我这段代码是 perl 而不是 bash 脚本。因为我对 linux 很陌生,所以我无法有所作为,你对他所说的话有什么看法?
    猜你喜欢
    • 2011-01-24
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多