Geçici olarak askıya alma nasıl engellenir?


10

Bunun için biraz araştırdım ve yararlı bir şey bulamıyorum.

30 dakika boyunca herhangi bir işlem yapılmadığında askıya almak üzere Ubuntu 12.10 çalıştıran bilgisayarım var. Bunu değiştirmek istemiyorum, çoğu zaman harika çalışıyor.

Yapmak istediğim, belirli bir uygulama çalışıyorsa otomatik askıya almayı devre dışı bırakmaktır. Bunu nasıl yapabilirim?

Şimdiye kadar bulduğum en yakın şey /usr/lib/pm-utils/sleep.d, uygulamanın çalışıp çalışmadığını kontrol eden ve askıya almanın önlenmesi gerektiğini belirtmek için 1 döndüren bir kabuk komut dosyası eklemektir . Ancak sistem 30 dakika sonra tekrar denemek yerine otomatik olarak askıya almayı bırakıyor gibi görünüyor. (Fareyi hareket ettirirsem zamanlayıcıyı yeniden başlatır.) Muhtemelen uygulama birkaç saat sonra bitecek ve eğer kullanmazsam bilgisayarımın otomatik olarak askıya alınmasını tercih ederim o noktada . (Bu yüzden uygulama bittiğinde pm-suspend çağrısına eklemek istemiyorum.)

Mümkün mü?

DÜZENLEME: Aşağıdaki yorumlardan birinde belirttiğim gibi, aslında istediğim, bilgisayarım NFS üzerinden dosya sunarken askıya almayı engellemekti; NFS parçasının nasıl çözüleceğine dair bir fikrim vardı, çünkü sorunun "askıya alma" kısmına odaklanmak istedim. Cevaplardan birinde verilen 'xdotool' fikrini kullanarak, birkaç dakikada bir cron'dan çalıştırdığım şu komut dosyasını buldum. İdeal değil çünkü ekran koruyucunun da tekmelemesini durduruyor, ancak çalışıyor. 'Kafeinin' neden daha sonra askıya almayı doğru bir şekilde yeniden etkinleştirmediğine bir göz atmam gerekiyor, o zaman muhtemelen daha iyisini yapabilirim. Her neyse, bu işe yarıyor gibi görünüyor, bu yüzden başka birinin ilgilenmesi durumunda buraya dahil ediyorum.

#!/bin/bash

# If the output of this function changes between two successive runs of this
# script, we inhibit auto-suspend.
function check_activity()
{
    /usr/sbin/nfsstat --server --list
}

# Prevent the automatic suspend from kicking in. 
function inhibit_suspend()
{
    # Slightly jiggle the mouse pointer about; we do a small step and
    # reverse step to try to stop this being annoying to anyone using the
    # PC. TODO: This isn't ideal, apart from being a bit hacky it stops
    # the screensaver kicking in as well, when all we want is to stop
    # the PC suspending. Can 'caffeine' help?
    export DISPLAY=:0.0
    xdotool mousemove_relative --sync --  1  1
    xdotool mousemove_relative --sync -- -1 -1
}

LOG="$HOME/log/nfs-suspend-blocker.log"
ACTIVITYFILE1="$HOME/tmp/nfs-suspend-blocker.current"
ACTIVITYFILE2="$HOME/tmp/nfs-suspend-blocker.previous"

echo "Started run at $(date)" >> "$LOG"
if [ ! -f "$ACTIVITYFILE1" ]; then
    check_activity > "$ACTIVITYFILE1"
    exit 0;
fi

/bin/mv "$ACTIVITYFILE1" "$ACTIVITYFILE2"
check_activity > "$ACTIVITYFILE1"

if cmp --quiet "$ACTIVITYFILE1" "$ACTIVITYFILE2"; then
    echo "No activity detected since last run" >> "$LOG"
else
    echo "Activity detected since last run; inhibiting suspend" >> "$LOG"
    inhibit_suspend
fi

DÜZENLEME 2: Yukarıdaki komut dosyası çalışır, ancak aşağıdaki başka bir yorum sayesinde, şimdi askıya almayı engellerken ekran koruyucunun devreye girmesine izin verme avantajına sahip olan bu komut dosyası çiftini kullanıyorum. Birincisi /usr/lib/pm-utils/sleep.d/000nfs-inhibit, bu da bir engelleme dosyası varsa askıya alma girişimini önler:

#!/bin/sh

LOG="/home/zorn/log/nfs-suspend-blocker.log"
INHIBITFILE="/home/zorn/tmp/nfs-suspend-blocker.inhibit"

echo "$0: Started run at $(date), arguments: $*" >> "$LOG"
if [ "$1" = "suspend" ] && [ -f "$INHIBITFILE" ]; then
    echo "$0: Inhibiting suspend" >> "$LOG"
    exit 1
fi
exit 0

İkincisi, önceki nfs-suspend-blocker betiğinin değiştirilmiş bir sürümüdür ve yine de cron'dan çalıştırılmalıdır. Şimdi aşağıdaki yorumda özetlenen stratejiyi takip ediyor:

#!/bin/bash

# This works in tandem with /usr/lib/pm-utils/sleep.d/000nfs-inhibit, which
# will prevent a suspend occurring if $INHIBITFILE is present. Once it prevents
# a suspend, it appears that it requires some "user activity" to restart the
# timer which will cause a subsequent suspend attempt, so in addition to
# creating or removing $INHIBITFILE this script also jiggles the mouse after
# removing the file to restart the timer.

# If the output of this function changes between two successive runs of this
# script, we inhibit auto-suspend.
function check_activity()
{
    /usr/sbin/nfsstat --server --list
}

# Slightly jiggle the mouse pointer about; we do a small step and reverse step
# to try to stop this being annoying to anyone using the PC.
function jiggle_mouse()
{
    export DISPLAY=:0.0
    xdotool mousemove_relative --sync --  1  1
    xdotool mousemove_relative --sync -- -1 -1
}

LOG="$HOME/log/nfs-suspend-blocker.log"
ACTIVITYFILE1="$HOME/tmp/nfs-suspend-blocker.current"
ACTIVITYFILE2="$HOME/tmp/nfs-suspend-blocker.previous"
INHIBITFILE="$HOME/tmp/nfs-suspend-blocker.inhibit"

echo "$0: Started run at $(date)" >> "$LOG"
if [ ! -f "$ACTIVITYFILE1" ]; then
    check_activity > "$ACTIVITYFILE1"
    exit 0;
fi

/bin/mv "$ACTIVITYFILE1" "$ACTIVITYFILE2"
check_activity > "$ACTIVITYFILE1"

if cmp --quiet "$ACTIVITYFILE1" "$ACTIVITYFILE2"; then
    echo "$0: No activity detected since last run" >> "$LOG"
    if [ -f "$INHIBITFILE" ]; then
            echo "$0: Removing suspend inhibit file and jiggling mouse" >> "$LOG"
            /bin/rm "$INHIBITFILE"
            jiggle_mouse
    fi
else
    echo "$0: Activity detected since last run; inhibiting suspend" >> "$LOG"
    touch "$INHIBITFILE"
fi

Soruyu karmaşıklaştırmak yerine, soruna iki çözümünüzü aşağıdaki cevap olarak koymalısınız.
Cas

Yanıtlar:


8

Bilgisayarınızı uyanık tutmak için bir program Kafein olduğunu . Orijinal kodunuz çağrıldığında kafeini çağırmak için bir .bash_aliases dosyası yaparım.

alias newname="origcode && caffeine"

Bilgisayarınızı uyanık tutmaya çalıştığınız koda bağlı olarak, diğer kod durdurulduğunda kafein öldürmeyi içeren özel bir komut dosyası oluşturmanız gerekir. Belirli kod hakkında daha fazla ayrıntı yardımcı olacaktır.

Güncelleme: basit bir yolu koşmak olacaktır xdotool ile monte edilebilir, sudo apt-get install xdotool. Hedef kodunuz açıldığında çağrılan bir komut dosyası yazabilir ve daha sonra sleepkomutu 29 dakika boyunca kullanabilir ve daha sonra xdotool key abilgisayarı uyanık tutmak için rasgele çalıştırıp çalıştırabilirsiniz .


2
Xdo için, doğal olarak bir şey yapmayan bir anahtar seçmek daha iyidir. Örneğin, üst karakter tuşuna basmak ekranı etkin pencereye yazmadan uyandıracaktır.
Oli

1
Teşekkür ederim. Kasten orijinal soruda biraz ayrıntı saklıyordum - açıkça yapmak istediğim, medya merkezim erişirken bilgisayarımı (NFS aracılığıyla medya içeriği sunan) askıya almayı durdurmak. Özellikle bu harika bir şekilde adreslenmenin bir yolunu biliyorsanız, aksi takdirde bunun Kafein ile çalışmasına izin verecek birkaç yol görebilirsiniz (örneğin, medya merkezi her 10 dakikada bir PC'ye ssh ve uyuyan bir kabuk komut dosyası çalıştıracaktır) 15 dakika için).
Zorn

1
Kafein denedim ve çalışan program kaybolduğunda, Kafein çıkışı askıya alma işleminin artık engellenmediğini söylüyor ancak ekranın iki kez hareketsiz kalmasına rağmen ve PC'nin askıya alınmasına rağmen bunu hiç yapmadım. Bununla birlikte, xdo rotası muhtemelen daha da uygun olacak ve önce bunu deneyeceğim. PS Bir yoruma yeni satır eklemek için herhangi bir yolu var mı ?!
Zorn

5

Eğer

  1. /Usr/lib/pm-utils/sleep.d içindeki bir komut dosyası uygulamanın çalışıp çalışmadığını kontrol edebilir ve askıya almanın önlenmesi gerektiğini belirtmek için 1 döndürür.
  2. "Sistem daha sonra otomatik olarak askıya almayı bırakıyor, 30 dakika sonra tekrar denemek yerine" zamanlayıcıyı yeniden başlatan fareyi hareket ettirerek çözüldü (umarım bununla ne demek istediğini doğru bir şekilde anladım)

neden uygulama sona erdikten sonra sadece fare işaretçisini jiggle değil.

Özetle:

  1. Sistemin askıya alınmasını önlemek için sleep.d kullanın.
  2. Fareyi bir kez sallayan bir komut dosyası yazın.
  3. 'Uzun süren komut dosyası && mousejiggle' deyin

Bu ekran koruyucuyu engellemez.

Tek sorun, sistem askıya alındığında işlemin sona ermesinden 30 dakika sonra olmasıdır. 'EDIT' çözümünüz için de durum böyledir.

Not: Bu sayfadan xdotool öğrendiğimde benzer bir soruna çözüm arıyordum. Çok teşekkürler. Bu yardımcı olur umarım.


Ustaca, teşekkürler! Ben bu hafta sonu bir gitmek verecektir.
Zorn

Bununla ilgili ipucu pm-utilsyardımcı oldu. Bunun çalışması için paketin pm-utilsyüklenmesi gerektiğini unutmayın - paket yüklenmemiş olsa bile dizinin kendisi mevcut olabilir.
krlmlr

1

EDIT 2, ekran koruyucunun devreye girmesine ve engelleme dosyasının kaldırılması durumunda otomatik askıya alma hizmetine devam etmesine rağmen, yukarıda belirtildiği gibi, sistem askıya alındığında dosya kaldırıldıktan 30 dakika sonra olacaktır.

Olası bir çözüm, dahili otomatik ekran koruyucuyu devre dışı bırakmak ve otomatik askıya alma işlevini devre dışı bırakmak ve bunları kendi başımıza uygulamak ve zamanlayıcının davranışını gerektiği gibi seçmektir. Xprintidle komutu(bunu yüklemeniz gerekebilir), klavye veya fare etkinliği olmayan milisaniye sayısını yazdırır. Bu çeşitli olasılıklar açar. Aşağıdaki hareketsizlik yöneticisini python'da uyguladım (bash betiklerinin çok fazla değil). Özellikler, ekran koruyucu ve / veya otomatik askıya alma için komut ayarlama, zaman aşımı ve engelleme dosyası (buna kilit denir) içerir. Buna ek olarak, engelleme dosyası kaldırıldığında veya kaldırılmadığında hareketsizlik zamanlayıcısının yeniden başlatılması gerekip gerekmediğini seçme seçeneği vardır (askıya alma ve ekran koruyucu için davranış farklı olabilir). Notlarda kullanımı netleştirmeye çalıştım ama net olmayan bir şey varsa sor.

#!/usr/bin/python

#Notes:##################

#   1. All TIMEOUTs are specified in seconds
#   2. 0 or negative TIMEOUT disables a particular action.
#   3. If an actionCOMMAND (like pm-suspend) requires 'sudo'ing, make them 'sudo'able without password. Alternatively, you may run this script in sudo mode, and make this script sudoable without password. /ubuntu/159007/specific-sudo-commands-without-password
#   4. 'action'_timer_starts_... option: True - if a lock file is created and then removed, inactivity timer (for that action) restarts at the time of deletion of lock. False - doesn't restart.
#   5. screensaverCOMMAND can be screen-lock (security) or screen-off (power saving) or both. To do both, but at different times (I can't see any reason to do so) extend this script from two actions (screensaver, autosuspend) to three (screen-lock, screen-off, autosuspend).

#########################

import os
import time
import threading
import subprocess

HOME = os.getenv('HOME') + '/'

#Configuration###########

screensaverCOMMAND = "gnome-screensaver-command --lock && xset -display :0.0 +dpms dpms force off"
autosuspendCOMMAND = "gnome-screensaver-command --lock && sudo pm-suspend"

screensaverTIMEOUT = 10*60
autosuspendTIMEOUT = 20*60

screensaverLOCK = HOME + ".inactivitymanager/screensaverLOCK"
autosuspendLOCK = HOME + ".inactivitymanager/autosuspendLOCK"

screensaver_timer_starts_only_after_lockfile_is_deleted = False
autosuspend_timer_starts_only_after_lockfile_is_deleted = False

#########################

def stayOn():
    print "inactivitymanager is running..."
    try:
        while True:
            time.sleep(10)
    except:
        print "Closed."

class inactivity_action(threading.Thread):
    def __init__(self, command, timeout, lock, timer_starts_blah):
        threading.Thread.__init__(self)
        self.daemon = True
        self.command = command
        self.timeout = timeout
        self.lock = lock
        self.timer_starts_blah = timer_starts_blah
    def run(self):
        if not(self.timer_starts_blah):
            while True:
                try:
                    while True:
                        time.sleep(1)
                        f = open(self.lock, 'r')
                        f.close()
                except IOError:
                    xidletime = int(subprocess.Popen('xprintidle', stdout = subprocess.PIPE).communicate()[0])/1000
                    if xidletime > self.timeout:
                        os.system(self.command)
                    else:
                        time.sleep(self.timeout - xidletime + 2)
        else:
            lockremovetime = 0
            while True:
                lockdetected = False
                try:
                    while True:
                        time.sleep(1)
                        f = open(self.lock, 'r')
                        f.close()
                        lockdetected = True
                except IOError: #Will enter this section if/when lockfile is/becomes absent
                    xidletime = int(subprocess.Popen('xprintidle', stdout = subprocess.PIPE).communicate()[0])/1000
                    if lockdetected:
                        lockremovetime = int(time.time())
                    timesincelockremove = int(time.time()) - lockremovetime
                    if min(xidletime, timesincelockremove) > self.timeout:
                        os.system(self.command)

if screensaverTIMEOUT > 0:
    inactivity_screensaver = inactivity_action(screensaverCOMMAND, screensaverTIMEOUT, screensaverLOCK, screensaver_timer_starts_only_after_lockfile_is_deleted)
    inactivity_screensaver.start()

if autosuspendTIMEOUT > 0:
    inactivity_autosuspend = inactivity_action(autosuspendCOMMAND, autosuspendTIMEOUT, autosuspendLOCK, autosuspend_timer_starts_only_after_lockfile_is_deleted)
    inactivity_autosuspend.start()

stayOn()

Kullanımı:

  1. Sadece inactivitymanager &ana dizinde .profile veya .xsessionrc'ye ekleyin (hangisinin sizin için çalıştığını görün. Her ikisini de eklemeyin, aksi takdirde bu komut dosyasının iki örneği aynı anda çalışır, işlemediğim bir şey. Sanırım bu ayrıntılarda ana uygulamaların özel olanları gölgelediği).
  2. Xprintidle yüklemeniz gerekebilir.

Engelleme dosyası oraya nasıl gelirse, kullanıcının hayal gücüne bırakılır (eğer kendimi bunun için bir arka plan programı uygulamak için getirirsem, bu cevaba bir EDIT koyacağım). Tabii ki (OP) davanız için çözdünüz. Birden fazla işlem için askıya almayı engellemeye çalışırken kaçınılması gereken bir tuzak, bir işlem devam ederken bir işlem sona erdiğinde kilit dosyasını silmektir. Alternatif olarak, belirli bir dizinde (kilit dizini) bir dosya varsa askıya almayı engellemek için komut dosyası biraz düzenlenebilir. Bu şekilde her işlemin kendi kilit dosyası olabilir.

Notlar:

  1. Bu script işlemci ve bellekte oldukça hafif. Ancak koddaki time.sleep (1) leri kaldırmak soruna neden olabilir - yine de kontrol etmediniz.
  2. pm-suspend, sudo izinleri gerektirir. Parola denetimi yapmadan pm-askıya almak için Parola olmadan belirli sudo komutlarını nasıl çalıştırabilirim? . Alternatif olarak bu betiği sudo modunda çalıştırabilir ve bu betiği parola olmadan sudoable yapabilirsiniz (betiği root olarak çalıştırıyorsanız sorun değil)
  3. Zaman aşımları ~ 10 saniyeden daha az olacak şekilde ayarlanmışsa komut dosyası sorun yaşayabilir (Sanırım sorunun tam olarak başladığı yerin 5'ten az olması gerektiğini kontrol etmedim). Bu işlem, sistem kaynakları pahasına bir miktar time.sleep (1) s kaldırılarak ele alınabilir. Kimsenin buna ihtiyacı olacağını düşünmeyin.
  4. Zamanlayıcılarda bir tutamamız olduğu için mousejiggle gerekmez!
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.