সাময়িকভাবে স্থগিতকরণ বাধা কিভাবে?


10

আমি এর জন্য কিছুটা অনুসন্ধান করেছি এবং সাহায্যকারী কিছুই খুঁজে পাচ্ছি না।

30 মিনিটের নিষ্ক্রিয়তার পরে স্থগিত করার জন্য আমার পিসি উবুন্টু 12.10 চলছে। আমি এটি পরিবর্তন করতে চাই না, এটি বেশিরভাগ সময় দুর্দান্ত কাজ করে।

আমি যা করতে চাই তা হ'ল কোনও নির্দিষ্ট অ্যাপ্লিকেশন চলমান থাকলে স্বয়ংক্রিয় স্থগিতটি অক্ষম করে। কিভাবে আমি এটি করতে পারব?

আমি এখন পর্যন্ত সবচেয়ে কাছের জিনিসটি পেয়েছি হ'ল একটি শেল স্ক্রিপ্ট যুক্ত করা /usr/lib/pm-utils/sleep.dযাতে অ্যাপ্লিকেশনটি চলছে কিনা তা পরীক্ষা করে এবং স্থগিত হওয়া রোধ করা উচিত কিনা তা বোঝাতে 1 ফেরত দেয়। তবে দেখে মনে হচ্ছে সিস্টেমটি আরও 30 মিনিটের পরে আবার চেষ্টা করার পরিবর্তে স্বয়ংক্রিয়ভাবে স্থগিত হওয়া ছেড়ে দেয়। (যতদূর আমি বলতে পারেন, যদি আমি মাউস সরানো, যে পুনরায় আরম্ভ টাইমার আবার।) এটা বেশ সম্ভবত আবেদন ঘন্টা দুয়েক পরে শেষ হবে, এবং আমি বরং আমার পিসিতে তখন স্বয়ংক্রিয়ভাবে স্থগিত চাই যদি আমি ব্যবহার করছি না এটা এই মুহুর্তে । (সুতরাং অ্যাপ্লিকেশন শেষ হয়ে গেলে আমি বিকাল-সাসপেন্ডে একটি কল যুক্ত করতে চাই না))

এটা কি সম্ভব?

সম্পাদনা: আমি নীচের মতামতগুলির একটিতে উল্লেখ করেছি যে, আমার পিসি যখন এনএফএসের উপর ফাইল সরবরাহ করছিল তখন আমি যা স্থিতি করতে চাইছিলাম তা স্থগিত করা বাধা দেওয়া; আমি কেবল প্রশ্নের "স্থগিত" অংশটির দিকে মনোনিবেশ করতে চেয়েছিলাম কারণ এনএফএস অংশটি কীভাবে সমাধান করবেন তা আমার ইতিমধ্যে ধারণা ছিল। উত্তরের একটিতে দেওয়া 'এক্সডটুল' ধারণাটি ব্যবহার করে, আমি নিম্নলিখিত স্ক্রিপ্টটি নিয়ে এসেছি যা প্রতি কয়েক মিনিটের মধ্যে ক্রোন থেকে চালিত হয়। এটি আদর্শ নয় কারণ এটি স্ক্রিনসেভারটিকেও লাথি মারা বন্ধ করে দেয় তবে এটি কার্যকর হয়। 'ক্যাফিন' কেন পরে স্থগিতাদেশটিকে সঠিকভাবে পুনরায় সক্ষম করে না সে সম্পর্কে আমার একবার নজর দেওয়া দরকার, তবে আমি সম্ভবত আরও ভাল করতে পারি। যাইহোক, এটি কাজ করে বলে মনে হচ্ছে, তাই অন্য কারও আগ্রহী হলে আমি এটি এখানে অন্তর্ভুক্ত করছি।

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

সম্পাদনা 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"

আপনি কোন কোডটির জন্য আপনার কম্পিউটারকে জাগ্রত রাখার চেষ্টা করছেন তার উপর নির্ভর করে, আপনাকে একটি কাস্টম স্ক্রিপ্ট তৈরি করতে হবে যাতে অন্য কোডটি বন্ধ হয়ে গেলে ক্যাফিন হত্যার বিষয়টি অন্তর্ভুক্ত থাকে। নির্দিষ্ট কোড সম্পর্কে আরও কিছু বিশদ সাহায্য করবে।

আপডেট: একটি সহজ উপায় হল এক্সডটুল চালানো , যা দিয়ে ইনস্টল করা যেতে পারে sudo apt-get install xdotool। আপনি যখন আপনার টার্গেট কোডটি খোলার সময় ডাকা হয় তখন একটি স্ক্রিপ্ট লিখতে পারেন এবং তারপরে sleep29 মিনিটের জন্য কমান্ডটি ব্যবহার করুন এবং তারপরে xdotool key aকম্পিউটারকে জাগ্রত রাখতে চালানো বা স্বেচ্ছাসেবী কিছু।


2
এক্সডোর পক্ষে সম্ভবত এমন কী বাছাই করা ভাল যা অন্তর্নিহিতভাবে কিছু না করে। শিফট টিপুন, উদাহরণস্বরূপ, সক্রিয় উইন্ডোতে টাইপ না করে পর্দা জাগিয়ে তুলবে।
অলি

1
ধন্যবাদ. আমি আসল প্রশ্নে ইচ্ছাকৃতভাবে কিছুটা গোপন করেছিলাম - আমার মিডিয়া সেন্টারটি এটি অ্যাক্সেস করার সময় আমার পিসি (যা এনএফএসের মাধ্যমে মিডিয়া সামগ্রীর পরিবেশন করছে) স্থগিত করা বন্ধ করতে হবে। আপনি যদি বিশেষভাবে এটির সমাধানের কোনও উপায় জানেন তবে এটি দুর্দান্ত হবে, অন্যথায় আমি কয়েকটি উপায় দেখতে পাচ্ছি যা এটিকে ক্যাফিনের মাধ্যমে কাজ করতে দেয় (উদাহরণস্বরূপ মিডিয়া সেন্টারটি প্রতি 10 মিনিটে আমার পিসিতে প্রবেশ করবে এবং একটি শেল স্ক্রিপ্ট চালাবে যা ঘুমায় 15 মিনিটের জন্য)।
জর্ন

1
আমি ক্যাফিন চেষ্টা করেছি এবং এটি চলমান প্রোগ্রামটি অদৃশ্য হয়ে যাওয়া ব্যতীত কাজ করে বলে মনে হয়, ক্যাফিন আউটপুট বলে যে স্থগিতকরণ আর বাধা হয় না তবে আমি নিষ্ক্রিয়তার সময়কালের জন্য দ্বিগুণ রেখেছিলাম এবং যদিও পর্দা স্থগিত করে পিসি কখনও করেনি। আমি এর সাথে আরও খেলব, যদিও এক্সডো রুট সম্ভবত আরও বেশি সুবিধাজনক হতে চলেছে এবং আমি প্রথমে চেষ্টা করব। পিএস কোনও মন্তব্যে একটি নতুন লাইন toোকানোর কোনও উপায় আছে ?!
জর্ন

5

যদি

  1. /Usr/lib/pm-utils/sleep.d এ থাকা একটি স্ক্রিপ্ট অ্যাপ্লিকেশনটি চলছে কিনা তা পরীক্ষা করে পরীক্ষা স্থগিত হওয়া উচিত কিনা তা বোঝাতে 1 এ ফিরে আসতে পারে।
  2. "সিস্টেমটি তখন স্বয়ংক্রিয়ভাবে স্থগিত হওয়া ছেড়ে দেয়, পরিবর্তে আরও ৩০ মিনিট পরে আবার চেষ্টা করার পরিবর্তে" মাউসটি সরানোর মাধ্যমে সমাধান করা হয় যা টাইমারটি আবার চালু করে (আমি আশা করি আপনি এর অর্থ কী বুঝেছেন তা আমি সঠিকভাবে বুঝতে পেরেছি)

তাহলে কেন অ্যাপ্লিকেশনটি শেষ হওয়ার পরে মাউস পয়েন্টারটি কেবল জাগল নয়।

সংক্ষেপ:

  1. সিস্টেমকে স্থগিত করা থেকে বাঁচতে স্লিপ.ড ব্যবহার করুন।
  2. একটি স্ক্রিপ্ট লিখুন যা মাউস একবার জিগল করে।
  3. 'দীর্ঘ-চলমান স্ক্রিপ্ট && মাউস জিগল' কল করুন

এটি স্ক্রিনসেভারকে বাধা দেবে না।

একমাত্র সমস্যাটি হ'ল সিস্টেম স্থগিত হওয়ার পরে প্রক্রিয়াটি শেষ হওয়ার 30 মিনিটের পরে এটি হবে। আপনার 'EDIT' সমাধানের ক্ষেত্রেও এটিই।

পিএস: আমি এই পৃষ্ঠাটি থেকে xdotool শিখতে গিয়ে অনুরূপ সমস্যার সমাধান খুঁজছিলাম। সূতরাং ধন্যবাদ. আশাকরি এটা সাহায্য করবে.


বুদ্ধিমান, আপনাকে ধন্যবাদ! আমি এই সপ্তাহান্তে যেতে হবে।
Zorn

সম্পর্কিত ইঙ্গিতটি pm-utilsসাহায্য করেছে। নোট করুন যে এটি pm-utilsকাজ করার জন্য প্যাকেজটি ইনস্টল করা দরকার - প্যাকেজ ইনস্টল না করা হলেও ডিরেক্টরি নিজেই উপস্থিত থাকতে পারে।
krlMLr

1

যদিও এডিআইটি 2 স্ক্রীন-ওভারটিকে কিক-ইন করতে দেয় এবং ইনহিবিট ফাইল অপসারণের জন্য অটোসপাস সার্ভিস পুনরায় চালু করতে পারে, যেমন উপরে উল্লিখিত রয়েছে যে সিস্টেমটি স্থগিত হওয়ার পরে ফাইলটি সরানোর ৩০ মিনিট পরে এটি হবে।

এর একটি সম্ভাব্য সমাধান হ'ল ইনবিল্ট অটো-স্ক্রীনসেভারটি অটো-সাসপেন্ড কার্যকারিতা অক্ষম করে এবং সেগুলি আমাদের নিজেরাই প্রয়োগ করে এবং প্রয়োজনীয় হিসাবে টাইমার আচরণ চয়ন করে। কমান্ড এক্সপ্রিনটিডল(আপনাকে এটি ইনস্টল করতে হতে পারে) মিলিসেকেন্ডগুলির সংখ্যা মুদ্রণ করে যার জন্য কোনও কীবোর্ড বা মাউস ক্রিয়াকলাপ নেই। এটি বেশ কয়েকটি সম্ভাবনা খোলে। আমি পাইথনে নিম্নলিখিত নিষ্ক্রিয়তা পরিচালককে প্রয়োগ করেছি (বাশ স্ক্রিপ্টারের খুব বেশি নয়)। বৈশিষ্ট্যগুলির মধ্যে স্ক্রীন ওভার এবং / অথবা অটোসপেন্ডের জন্য কমান্ড, টাইমআউট এবং ইনহিবিট ফাইল (আমি এটিকে লক বলেছি) সেট করা অন্তর্ভুক্ত। নিষ্ক্রিয় ফাইলটি অপসারণ করার সময় নিষ্ক্রিয়তা টাইমার পুনরায় চালু করা উচিত কিনা তা চয়ন করার বিকল্প রয়েছে (আচরণ স্থগিতকরণ এবং স্ক্রীন-সেভারের জন্য আলাদা হতে পারে)। আমি নোটগুলিতে ব্যবহারটি পরিষ্কার করার চেষ্টা করেছি তবে কিছু অস্পষ্ট থাকলে জিজ্ঞাসা করবেন না।

#!/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 &হোম ডিরেক্টরিতে। প্রোফাইল বা .xsessionrc এ যুক্ত করুন (দেখুন কোনটি আপনার জন্য কাজ করে both উভয়টিই যুক্ত করবেন না, অন্যথায় এই স্ক্রিপ্টের দুটি উদাহরণ এক সাথে চলবে, এমন কিছু যা আমি পরিচালনা করি নি I আমি অনুমান করি এটি এই বিবরণীতে রয়েছে) মূলধারার বাস্তবায়নগুলি ট্রাম্প কাস্টমগুলি)।
  2. আপনাকে এক্সপ্রিনটিডল ইনস্টল করতে হতে পারে।

বাধা ফাইলটি কীভাবে সেখানে পাওয়া যায় তা আপাতত ব্যবহারকারীর কল্পনাতে রেখে যায় (যদি আমি এটির জন্য একটি ডেমন বাস্তবায়নের জন্য নিজেকে নিয়ে যাই, তবে আমি এই উত্তরের একটি সম্পাদনা করব)। আপনি (ওপি) অবশ্যই এটি আপনার ক্ষেত্রে সমাধান করেছেন। একাধিক প্রক্রিয়া স্থগিত করা বাধা দেওয়ার চেষ্টা করার সময় একটি এড়াতে হবে যখন অন্য প্রক্রিয়াটি চলমান অবস্থায় একটি প্রক্রিয়াটি শেষ হয়ে যায় তখন লক ফাইলটি মুছে ফেলা হয়। বিকল্পভাবে, কোনও ফাইল কোনও নির্দিষ্ট ডিরেক্টরিতে (লক ডিরেক্টরিতে) উপস্থিত থাকলে সাসপেন্ডটি আটকাতে স্ক্রিপ্টটি সামান্য সম্পাদনা করা যেতে পারে। এই পদ্ধতিতে প্রতিটি প্রক্রিয়াটির নিজস্ব লক ফাইল থাকতে পারে।

মন্তব্য:

  1. এই স্ক্রিপ্টটি প্রসেসর এবং মেমরির উপর বেশ হালকা। তবে কোডে সময় (ঘুম) (স) কে সরিয়ে ফেলার কারণে সমস্যা হতে পারে - যদিও এটি চেক করা হয়নি।
  2. পিএম-সাসপেন্ডের জন্য সুডোর অনুমতি প্রয়োজন। পাসওয়ার্ড চেকআউট না দিয়ে পিএম-সাসপেন্ড করার জন্য আমি কীভাবে পাসওয়ার্ড ছাড়াই নির্দিষ্ট sudo কমান্ড চালাব? । বিকল্পভাবে আপনি এই স্ক্রিপ্টটি sudo মোডে চালাতে পারেন এবং পাসওয়ার্ড ছাড়াই এই স্ক্রিপ্টটিকে sudoable করতে পারেন (আপনি যদি স্ক্রিপ্টটিকে মূল হিসাবে চালাচ্ছেন তবে কোনও সমস্যা নয়)
  3. টাইমআউটগুলি 10 সেকেন্ডের চেয়ে কম সেট করা থাকলে স্ক্রিপ্টটি সমস্যার মধ্যে পড়তে পারে (আমার ধারণা, সমস্যাটি ঠিক কোথায় শুরু হয় অবশ্যই 5 এর চেয়ে কম হওয়া উচিত check সিস্টেম রিসোর্সের ব্যয়ে কিছু সময় নিদ্রা (1) গুলি সরিয়ে এটি পরিচালনা করা যায়। যদিও কারও এটির প্রয়োজন হবে না।
  4. কারণ আমাদের টাইমারগুলিতে একটি হ্যান্ডেল রয়েছে, কোনও মাউস জিগলসের প্রয়োজন নেই!
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.