अस्थायी रूप से निलंबन को कैसे रोकें?


10

मैंने इसके लिए थोड़ा खोज किया है और कुछ भी उपयोगी नहीं मिल सकता है।

मेरे पास 30 मिनट की निष्क्रियता के बाद निलंबित करने के लिए स्थापित मेरा पीसी Ubuntu 12.10 है। मैं इसे बदलना नहीं चाहता, यह ज्यादातर समय काम करता है।

यदि मैं चाहता हूं कि कोई विशेष एप्लिकेशन चल रहा है, तो स्वचालित निलंबन को अक्षम कर दें। मैं यह कैसे कर सकता हूँ?

अब तक मैंने जो सबसे निकटतम चीज़ पाई है, वह एक शेल स्क्रिप्ट को जोड़ना है /usr/lib/pm-utils/sleep.dजिसमें यह जांचता है कि क्या एप्लिकेशन चल रहा है और 1 को इंगित करता है कि सस्पेंड को रोका जाना चाहिए। लेकिन ऐसा लग रहा है कि सिस्टम फिर से 30 मिनट के बाद फिर से कोशिश करने के बजाय, स्वचालित रूप से निलंबित करने के लिए छोड़ देता है। (जहां तक ​​मैं बता सकता हूं, अगर मैं माउस को स्थानांतरित करता हूं, जो टाइमर को फिर से शुरू करता है।) यह काफी संभावना है कि आवेदन कुछ घंटों के बाद समाप्त हो जाएगा, और मैं अपने पीसी को स्वचालित रूप से निलंबित कर दूंगा यदि मैं उपयोग नहीं कर रहा हूं यह उस बिंदु पर है । (इसलिए जब आवेदन समाप्त हो जाता है तो मैं pm- सस्पेंड करने के लिए कॉल नहीं जोड़ना चाहता।)

क्या यह संभव है?

संपादित करें: जैसा कि मैंने नीचे दी गई टिप्पणियों में से एक में उल्लेख किया है, जो मैं वास्तव में चाहता था कि सस्पेंड को रोकना जब मेरा पीसी एनएफएस पर फाइलें परोस रहा था; मैं सिर्फ सवाल के "सस्पेंड" भाग पर ध्यान केंद्रित करना चाहता था क्योंकि मुझे पहले से ही पता था कि एनएफएस भाग को कैसे हल किया जाए। उत्तरों में से एक में दिए गए 'xdotool' विचार का उपयोग करते हुए, मैं निम्नलिखित स्क्रिप्ट के साथ आया हूं जो मैं हर कुछ मिनटों में क्रोन से चलाता हूं। यह आदर्श नहीं है क्योंकि यह स्क्रीनसेवर को भी लात मारना बंद कर देता है, लेकिन यह काम करता है। मुझे यह देखने की आवश्यकता है कि 'कैफीन' बाद में सस्पेंड को फिर से सक्षम क्यों नहीं करता है, तो मैं शायद बेहतर कर सकता हूं। वैसे भी, यह काम करने लगता है, इसलिए मैं इसमें शामिल हूं अगर किसी और को दिलचस्पी है।

#!/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

EDIT 2: स्क्रिप्ट ऊपर काम करती है लेकिन नीचे एक और टिप्पणी के लिए धन्यवाद, मैं अब इस जोड़ीदार स्क्रिप्ट का उपयोग कर रहा हूं, जिसमें स्क्रीनसेवर को किक करने की अनुमति देने का फायदा है जबकि मैं सस्पेंड को रोक रहा हूं। पहला /usr/lib/pm-utils/sleep.d/000nfs-inhibit है, जो एक अवरोधक फ़ाइल मौजूद होने पर एक निलंबित प्रयास को रोक देगा:

#!/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

दूसरा पिछले एनएफ़एस-सस्पेंड-ब्लॉकर स्क्रिप्ट का एक संशोधित संस्करण है और इसे अभी भी क्रोन से चलाया जाना चाहिए। अब यह नीचे दी गई टिप्पणी में उल्लिखित रणनीति का अनुसरण करता है:

#!/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

सवाल को टटोलने के बजाय आपको समस्या के दो हल नीचे एक उत्तर के रूप में देने चाहिए।
कैस

जवाबों:


8

आपके कंप्यूटर को जागृत रखने का एक कार्यक्रम कैफीन है । जब आपका मूल कोड कहा जाता है तो मैं कैफीन को कॉल करने के लिए एक .bash_aliases फ़ाइल भी बनाऊंगा।

alias newname="origcode && caffeine"

किस कोड के आधार पर आप अपने कंप्यूटर को जागृत रखने की कोशिश कर रहे हैं, आपको एक कस्टम स्क्रिप्ट बनानी होगी जिसमें कैफीन को मारना शामिल है जब दूसरा कोड बंद हो जाता है। विशेष कोड के बारे में कुछ और जानकारी से मदद मिलेगी।

अद्यतन: एक सरल तरीका xdotool चलाना होगा , जिसे साथ स्थापित किया जा सकता है sudo apt-get install xdotool। आप एक स्क्रिप्ट लिख सकते हैं, जिसे तब कहा जाता है जब आपका लक्ष्य कोड खोला जाता है और फिर sleep29 मिनट के लिए कमांड का उपयोग किया जाता है और फिर xdotool key aकंप्यूटर को जगाए रखने के लिए मनमाने तरीके से चलाया जाता है।


2
Xdo के लिए, संभवतः एक कुंजी चुनना बेहतर है जो स्वाभाविक रूप से कुछ नहीं करता है। उदाहरण के लिए प्रेसिंग शिफ्ट, सक्रिय विंडो पर टाइप किए बिना स्क्रीन को जगाएगा।
ओली

1
धन्यवाद। मैं जानबूझकर मूल प्रश्न में थोड़ा विस्तार छिपा रहा था - जो मैं स्पष्ट रूप से करना चाहता हूं वह मेरा पीसी (जो एनएफएस के माध्यम से मीडिया सामग्री परोस रहा है) को निलंबित कर रहा है जबकि मेरा मीडिया केंद्र इसे एक्सेस कर रहा है। यदि आप इसे विशेष रूप से संबोधित करने का एक तरीका जानते हैं, तो यह बहुत अच्छा होगा, अन्यथा मैं कुछ ऐसे रास्तों को देख सकता हूं, जो इसे कैफीन के माध्यम से काम करने की अनुमति देंगे (उदाहरण के लिए मीडिया सेंटर हर 10 मिनट में मेरे पीसी में ssh और एक शेल स्क्रिप्ट चलाएगा जो सोता है 15 मिनट्स के लिए)।
Zorn

1
मैंने कैफीन की कोशिश की है और यह छोड़कर काम करने लगता है कि एक बार चल रहे कार्यक्रम के गायब हो जाने के बाद, कैफीन आउटपुट कहता है कि सस्पेंड अब बाधित नहीं है, लेकिन मैंने इसे दो बार निष्क्रियता अवधि के लिए छोड़ दिया और हालांकि स्क्रीन ने पीसी को निलंबित कर दिया। मैं इसके साथ आगे भी खेलूंगा, हालांकि xdo मार्ग संभवतः और भी सुविधाजनक होने जा रहा है और मैं पहले यही कोशिश करूंगा। पुनश्च वहाँ एक टिप्पणी में एक newline डालने के लिए कोई रास्ता नहीं है ?!
Zorn

5

अगर

  1. /Usr/lib/pm-utils/sleep.d में एक स्क्रिप्ट यह देख सकती है कि क्या एप्लिकेशन चल रहा है और 1 को वापस लौटने के लिए इंगित करें कि निलंबित को रोका जाना चाहिए।
  2. "सिस्टम तब समस्या को स्वचालित रूप से निलंबित करने पर छोड़ देता है, एक और 30 मिनट के बाद फिर से प्रयास करने के बजाय" माउस को स्थानांतरित करके हल किया जाता है जो फिर से टाइमर को पुनरारंभ करता है (मुझे आशा है कि मैंने ठीक से समझा है कि आप इसका क्या मतलब है)

तो फिर क्यों नहीं आवेदन समाप्त होने के बाद सिर्फ माउस संकेतक।

संक्षेपित करते हुए:

  1. सिस्टम को निलंबित रखने के लिए sleep.d का उपयोग करें।
  2. एक स्क्रिप्ट लिखें जो एक बार माउस को जिगल्स कर दे।
  3. 'लॉन्ग-रनिंग-स्क्रिप्ट और& माउसजिगेल' को कॉल करें

इससे स्क्रीनसेवर में बाधा नहीं आएगी।

एकमात्र समस्या यह है कि यह प्रक्रिया समाप्त होने के 30 मिनट बाद होगी जब सिस्टम निलंबित हो जाएगा। आपके 'EDIT' समाधान के मामले में भी यही स्थिति है।

पुनश्च: जब मैं इस पृष्ठ से xdotool सीखा, तो मैं इसी तरह की समस्या के समाधान की तलाश में था। तो धन्यवाद। उम्मीद है की यह मदद करेगा।


सरल, धन्यवाद! मैं दे दूँगा कि इस सप्ताह के अंत में जाना।
Zorn

संकेत से संबंधित pm-utilsमदद की। ध्यान दें कि काम करने के लिए पैकेज pm-utilsको स्थापित करने की आवश्यकता है - पैकेज स्थापित नहीं होने पर भी निर्देशिका स्वयं मौजूद हो सकती है।
krlmlr

1

हालांकि EDIT 2 स्क्रीनसेवर को किक-इन की सुविधा देता है और अवरोधक फ़ाइल को हटाने पर ऑटोससपेंड सेवा को फिर से शुरू करता है, जैसा कि ऊपर बताया गया है कि फ़ाइल को हटाने के 30 मिनट बाद जब सिस्टम निलंबित हो जाएगा।

एक संभव समाधान इनबिल्ट ऑटो-स्क्रीनसेवर और ऑटो-सस्पेंड कार्यक्षमता को अक्षम करना और उन्हें हमारे स्वयं पर लागू करना है, और आवश्यकतानुसार टाइमर के व्यवहार को चुनना है। कमांड xprintidle(आपको इसे स्थापित करना पड़ सकता है) मिलीसेकंड की संख्या को प्रिंट करता है जिसके लिए कोई कीबोर्ड या माउस गतिविधि नहीं हुई है। इससे कई संभावनाएं खुलती हैं। मैंने अजगर में निम्नलिखित निष्क्रियता प्रबंधक को लागू किया है (बैश के बहुत ज्यादा नहीं)। स्क्रीनसेवर और / या ऑटोसस्पेंड के लिए सुविधाओं में कमांड सेट करना, टाइमआउट और अवरोधक फ़ाइल (मैंने इसे लॉक कहा है) शामिल है। इसके अलावा, यह चुनने का विकल्प है कि क्या अवरोधक टाइमर को पुनरारंभ करना चाहिए जब अवरोध फ़ाइल को हटा दिया जाता है या नहीं (व्यवहार निलंबित और स्क्रीनसेवर के लिए भिन्न हो सकता है)। मैंने नोटों में उपयोग को स्पष्ट करने की कोशिश की है, लेकिन अगर कुछ स्पष्ट नहीं है तो पूछें।

#!/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()

उपयोग:

  1. बस inactivitymanager &होम निर्देशिका में .profile या .xsessionrc जोड़ें (देखें कि कौन सा आपके लिए काम करता है। दोनों में न जोड़ें। इस स्क्रिप्ट के दो और उदाहरण एक साथ चलेंगे, कुछ मैंने संभाला है। मुझे लगता है कि यह इन विवरणों में है। कि मुख्यधारा के कार्यान्वयन ट्रम्प कस्टम वाले)।
  2. आपको xprintidle इंस्टॉल करना पड़ सकता है।

अवरोधक फ़ाइल को कैसे प्राप्त होता है, इसके लिए उपयोगकर्ता की कल्पना को अभी के लिए छोड़ दिया गया है (यदि मैं इसके लिए एक डेमॉन को लागू करने के लिए खुद को लाता हूं, तो मैं इसे इस उत्तर में EDIT में डालूंगा)। आप (ओपी) ने इसे आपके मामले के लिए हल कर दिया है। एक से अधिक प्रक्रिया के लिए निलंबन को रोकने की कोशिश करते समय बचने के लिए एक नुकसान यह है कि एक प्रक्रिया समाप्त होने पर लॉक फ़ाइल को हटा रहा है, जबकि दूसरा अभी भी चल रहा है। वैकल्पिक रूप से, स्क्रिप्ट को निलंबित करने के लिए थोड़ा एडिट किया जा सकता है यदि कोई फ़ाइल किसी विशेष निर्देशिका (लॉक डायरेक्टरी) में मौजूद है। इस तरह प्रत्येक प्रक्रिया की अपनी लॉक फाइल हो सकती है।

टिप्पणियाँ:

  1. यह स्क्रिप्ट प्रोसेसर और मेमोरी पर काफी हल्की है। लेकिन कोड में time.sleep (1) को हटाने से परेशानी हो सकती है - हालांकि जाँच नहीं की गई है।
  2. pm- सस्पेंड को sudo परमिशन की आवश्यकता होती है। पासवर्ड चेकआउट के बिना pm- सस्पेंड करने के लिए मैं एक पासवर्ड के बिना विशिष्ट sudo कमांड कैसे चलाऊं? । वैकल्पिक रूप से आप इस स्क्रिप्ट को sudo मोड में चला सकते हैं, और इस स्क्रिप्ट को पासवर्ड के बिना sudoable बना सकते हैं (यदि आप स्क्रिप्ट के रूप में स्क्रिप्ट चला रहे हैं तो कोई समस्या नहीं है)
  3. यदि समय-सीमा ~ 10 सेकंड से कम हो, तो स्क्रिप्ट मुसीबत में पड़ सकती है (यह मत देखिए कि वास्तव में जहां परेशानी शुरू होती है वह 5 से कम होनी चाहिए, मेरा अनुमान है)। यह सिस्टम संसाधनों की कीमत पर कुछ time.sleep (1) s को हटाकर नियंत्रित किया जा सकता है। हालांकि किसी को भी इसकी आवश्यकता नहीं होगी।
  4. क्योंकि हम टाइमर पर एक हैंडल है, कोई माउसजिगल्स की आवश्यकता नहीं है!
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.