Используйте cron для захвата экрана в Mac OS X

2867
physicsmichael

Чтобы проанализировать использование моего собственного компьютера, чтобы не шпионить за кем-либо (хотя это приходило мне в голову), я хочу, чтобы cron захватывал текущий экран каждую минуту.

 * * * * * /bin/bash -c "/usr/sbin/screencapture /somedir/screen.png" 

в crontab запустят и сделают снимок экрана. Тем не менее, он полностью черный, потому что он работает не так, как я. Есть идеи, как разрешить работе cron захватывать мой экран?

Обновление: я добавил say whoamiк той же команде cron, и она подтверждает, что она работает как мой пользователь (без участия sudo или других пользователей). Я получаю доступ к crontab из терминала как сам.

Таким образом, он работает как я, но не привязан к моей оконной системе. Есть идеи?

7
Вы добавляете это в системный (корневой) crontab или в свой пользовательский crontab? Richard Hoskins 14 лет назад 0

3 ответа на вопрос

10
todbot

Если вы посмотрите на конец страницы mancapture, то увидите, что там написано:

Чтобы захватить содержимое экрана при входе в систему через ssh, необходимо запустить снимок экрана в той же иерархии начальной загрузки машины, что и в окне входа в систему:  PID = pid окна входа в систему sudo launchctl bsexec $ PID screencapture [опции] 

Поэтому я думаю, что вы могли бы сделать что-то подобное в своем сценарии оболочки, который вызывает cron:

# / Бен / ш loginwindowpid = `ps axo pid, comm | grep '[l] oginwindow' | sed -n 's # * \ ([^] * \). * $ # \ 1 # p'` sudo launchctl bsexec $ loginwindowpid screencapture /somedir/screen.png 

Конечно, вам понадобится ваш идентификатор пользователя, чтобы не нуждаться в пароле для sudo.
То есть вы должны установить в / etc / sudoers команду visudo

youruserid ALL = (ALL) NOPASSWD: ALL 
Прекрасное решение моего вопроса. Очень полный Я прочитал справочную страницу, но «та же иерархия начальной загрузки машины» прошла прямо над моей головой, поэтому я направился прямо к SU, чтобы помочь разобраться в этом. Большое спасибо. physicsmichael 14 лет назад 0
Вы можете исключить вызов `grep -v`, сделав первый вызов похожим на` grep [l] oginwindow` и, возможно, сможете устранить вызов `cut` с помощью` ps axo comm` Dennis Williamson 14 лет назад 1
Очень хорошее решение. Laurent Etiemble 14 лет назад 0
0
John T

Если вы собираетесь использовать sudoдля настройки cronдругой учетной записи, вы можете использовать -uпереключатель вместе с sudo.

пример:

sudo -u Your_user crontab -e 

иначе просто войдите в эту учетную запись и используйте crontab -e.

0
Joe

Кроме того, я использую Java для той же работы. Это начинается при загрузке, и я просматриваю изображения в конце дня.

/** * Code modified from code given in http://whileonefork.blogspot.co.uk/2011/02/java-multi-monitor-screenshots.html following a SE question at  * http://stackoverflow.com/questions/10042086/screen-capture-in-java-not-capturing-whole-screen and then modified by a code review at http://codereview.stackexchange.com/questions/10783/java-screengrab */ package com.tmc.personal;  import java.awt.AWTException; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.awt.Robot; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; import java.util.concurrent.TimeUnit;  import javax.imageio.ImageIO;  class ScreenCapture {  static int minsBetweenScreenshots = 5;  public static void main(String args[]) { int indexOfPicture = 1000;// should be only used for naming file... while (true) { takeScreenshot("ScreenCapture" + indexOfPicture++); try { TimeUnit.MINUTES.sleep(minsBetweenScreenshots); } catch (Exception e) { e.printStackTrace(); } } }  //from http://www.coderanch.com/t/409980/java/java/append-file-timestamp private final static String getDateTime() { DateFormat df = new SimpleDateFormat("yyyy-MM-dd_hh:mm:ss"); df.setTimeZone(TimeZone.getTimeZone("PST")); return df.format(new Date()); }  public static void takeScreenshot(String filename) { Rectangle allScreenBounds = getAllScreenBounds(); Robot robot; try { robot = new Robot(); BufferedImage screenShot = robot.createScreenCapture(allScreenBounds); ImageIO.write(screenShot, "jpg", new File(filename + getDateTime()+ ".jpg")); } catch (AWTException e) { System.err.println("Something went wrong starting the robot"); e.printStackTrace(); } catch (IOException e) { System.err.println("Something went wrong writing files"); e.printStackTrace(); } }  /** * Okay so all we have to do here is find the screen with the lowest x, the * screen with the lowest y, the screen with the higtest value of X+ width * and the screen with the highest value of Y+height *  * @return A rectangle that covers the all screens that might be nearby... */ private static Rectangle getAllScreenBounds() { Rectangle allScreenBounds = new Rectangle(); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] screens = ge.getScreenDevices();  int farx = 0; int fary = 0; for (GraphicsDevice screen : screens) { Rectangle screenBounds = screen.getDefaultConfiguration().getBounds(); // finding the one corner if (allScreenBounds.x > screenBounds.x) { allScreenBounds.x = screenBounds.x; } if (allScreenBounds.y > screenBounds.y) { allScreenBounds.y = screenBounds.y; } // finding the other corner if (farx < (screenBounds.x + screenBounds.width)) { farx = screenBounds.x + screenBounds.width; } if (fary < (screenBounds.y + screenBounds.height)) { fary = screenBounds.y + screenBounds.height; } allScreenBounds.width = farx - allScreenBounds.x; allScreenBounds.height = fary - allScreenBounds.y; } return allScreenBounds; } } 
Основные синтаксические ошибки с тем, что вы опубликовали bafromca 11 лет назад 0
извинения - я добавил недостающие скобки ... Joe 11 лет назад 0
В конце все еще отсутствует еще одна фигурная скобка. Он открывает класс main (), while, try / catch, а затем закрывает try / catch, while, main (), но не закрывает класс. И затем он пропускает свои операторы импорта наверху также. Это то, что я закончил с тем, чтобы просто скомпилировать. Это все еще не бежит: http://pastebin.com/PrSfhUkS bafromca 11 лет назад 0
Хорошо - я дал полный код (также доступен по адресу http://codereview.stackexchange.com/questions/10783/java-screengrab) - могу ли я попросить вас исправить форматирование? - Я должен спешить ... Joe 11 лет назад 0

Похожие вопросы