क्या यह संभव है कि उबंटू को एक स्क्रिप्ट सेट करने से पहले इसे बंद नहीं किया जाए?


15

मैं एक डिस्क से दूसरे डिस्क में एक btrfs विभाजन के वृद्धिशील बैकअप करने के लिए एक स्क्रिप्ट का उपयोग करता हूं।

स्क्रिप्ट की शुरुआत cron.weekly द्वारा एक दिन के यादृच्छिक समय पर की जाती है।

अगर मैं सिस्टम को बंद कर रहा हूं, जबकि स्क्रिप्ट चल रही है, तो मैं पुराने बैकअप को हटाए जाने और नए नहीं बनाए जाने से परेशान हूं।

क्या स्क्रिप्ट को समाप्त होने तक प्रतीक्षा करने के लिए सिस्टम को सेटअप करने का कोई तरीका है?

मैं सिस्टमैब के साथ Ubuntu 16.04 का उपयोग कर रहा हूं।


GUI कमांड को ब्लॉक करने का एक तरीका है। मैंने उसके लिए एक स्क्रिप्टिंग तरीका अपनाया है। लेकिन कमांड लाइन sudo उपयोगकर्ता द्वारा किए जाने पर ब्लॉक करना संभव नहीं है । मैं GUI के लिए पिछले उत्तर को लिंक करूंगा। मुझे पता है कि क्या आप चाहते हैं कि यह आपकी आवश्यकताओं के अनुरूप हो
सर्गी कोलोडियाज़नी


1
@ बाइटकॉमर सावधान: वे प्री-सिस्टमड हैं।
रिनविंड

1
@ शेर अच्छा एक :) लेकिन systemd-inhibitआंखों पर थोड़ा आसान नहीं है? >: - डी
रिनविंड

1
यदि स्क्रिप्ट लॉक हो जाती है तो क्या होता है? क्या यह बेहतर नहीं होगा कि आप अपने पुराने बैकअप को तब तक न हटाएं जब तक कि नए वैसे भी खत्म न हो जाएं? जब आप शटडाउन को रोकने में सक्षम हो सकते हैं तो आप ऐसी स्थिति को रोक नहीं सकते हैं जहां सिस्टम विफलता या सामान्य बिजली हानि हो। या तो मामले में आप अभी भी अपने पुराने बैकअप को हटा चुके हैं और नया नहीं बनाया गया है।
जो डब्ल्यू

जवाबों:


20

Ubuntu 16.04+ के लिए सिस्टमड (डिफ़ॉल्ट) का उपयोग करना।

systemd-inhibit --why="Wait for this script to finish" bash script.sh

===

परीक्षा:

$ systemctl poweroff
Operation inhibited by "bash script.sh" (PID 23912 "systemd-inhibit", user rinzwind),
reason is "Wait for this script to finish".
Please retry operation after closing inhibitors and logging out other users.

===

7 ताले हैं :

  • sleep सिस्टम (सस्पेंडेड) उपयोगकर्ताओं द्वारा अनुरोधित सिस्टम सस्पेंड और हाइबरनेशन को रोकता है
  • shutdown उच्च-स्तरीय सिस्टम पावर-ऑफ और रिबूट द्वारा (अनप्रिविलेबल) उपयोगकर्ताओं द्वारा अनुरोध को रोकता है
  • idle रोकता है कि सिस्टम निष्क्रिय मोड में चला जाता है, संभवतः कॉन्फ़िगरेशन के आधार पर स्वचालित प्रणाली निलंबित या बंद हो जाती है।
  • handle-power-key सिस्टम पावर हार्डवेयर कुंजी के निम्न-स्तरीय (यानी लॉगइंड-इंटरनल) हैंडलिंग को रोकता है, जिससे संभवतया (अनपेक्षित रूप से) बाहरी कोड को ईवेंट को संभालने की अनुमति मिलती है।
  • handle-suspend-key सिस्टम हार्डवेयर के निम्न-स्तरीय हैंडलिंग को रोकता है कुंजी को स्थगित करें।
  • handle-hibernate-key सिस्टम हार्डवेयर हाइबरनेट कुंजी के निम्न-स्तरीय हैंडलिंग को रोकता है।
  • handle-lid-switch Systemd हार्डवेयर लिड स्विच के निम्न-स्तरीय हैंडलिंग को रोकता है।

आप शायद रोकना भी चाहते हैं suspend, idleऔरhibernate


"पैकेज मैनेजर" का उपयोग करके उदाहरण :

fd = Inhibit("shutdown:idle", "Package Manager", "Upgrade in progress...", "block");
/* ...
      do your work
                 ... */
close(fd);

इसके समान आप अपने संस्करण को कोड कर सकते हैं और इस स्क्रिप्ट के अंत में एक "शटडाउन" जोड़ सकते हैं (या एक शटडाउन निर्धारित करने के लिए एक तरीका जोड़ सकते हैं अगली कार्रवाई की आवश्यकता है)।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; यहाँ होने वाली बातचीत को बातचीत में बदल दिया गया ।
थॉमस वार्ड

2

में BackInTime मैं सभी प्रमुख des पर काम करने के लिए जोड़े को अलग DBus तरीकों का उपयोग कर रहा हूँ। केवल नकारात्मक पक्ष यह है इस के लिए काम नहीं करेगा है rootक्योंकि rootकोई नहीं है dbus.SessionBus

#!/usr/bin/env python3
import sys
import dbus
from time import sleep

INHIBIT_LOGGING_OUT = 1
INHIBIT_USER_SWITCHING = 2
INHIBIT_SUSPENDING = 4
INHIBIT_IDLE = 8

INHIBIT_DBUS = (
               {'service':      'org.gnome.SessionManager',
                'objectPath':   '/org/gnome/SessionManager',
                'methodSet':    'Inhibit',
                'methodUnSet':  'Uninhibit',
                'interface':    'org.gnome.SessionManager',
                'arguments':    (0, 1, 2, 3)
               },
               {'service':      'org.mate.SessionManager',
                'objectPath':   '/org/mate/SessionManager',
                'methodSet':    'Inhibit',
                'methodUnSet':  'Uninhibit',
                'interface':    'org.mate.SessionManager',
                'arguments':    (0, 1, 2, 3)
               },
               {'service':      'org.freedesktop.PowerManagement',
                'objectPath':   '/org/freedesktop/PowerManagement/Inhibit',
                'methodSet':    'Inhibit',
                'methodUnSet':  'UnInhibit',
                'interface':    'org.freedesktop.PowerManagement.Inhibit',
                'arguments':    (0, 2)
               })

def inhibitSuspend(app_id = sys.argv[0],
                    toplevel_xid = None,
                    reason = 'take snapshot',
                    flags = INHIBIT_SUSPENDING | INHIBIT_IDLE):
    """
    Prevent machine to go to suspend or hibernate.
    Returns the inhibit cookie which is used to end the inhibitor.
    """
    if not app_id:
        app_id = 'backintime'
    if not toplevel_xid:
        toplevel_xid = 0

    for dbus_props in INHIBIT_DBUS:
        try:
            bus = dbus.SessionBus()
            interface = bus.get_object(dbus_props['service'], dbus_props['objectPath'])
            proxy = interface.get_dbus_method(dbus_props['methodSet'], dbus_props['interface'])
            cookie = proxy(*[(app_id, dbus.UInt32(toplevel_xid), reason, dbus.UInt32(flags))[i] for i in dbus_props['arguments']])
            print('Inhibit Suspend started. Reason: %s' % reason)
            return (cookie, bus, dbus_props)
        except dbus.exceptions.DBusException:
            pass
    print('Inhibit Suspend failed.')

def unInhibitSuspend(cookie, bus, dbus_props):
    """
    Release inhibit.
    """
    assert isinstance(cookie, int), 'cookie is not int type: %s' % cookie
    assert isinstance(bus, dbus.bus.BusConnection), 'bus is not dbus.bus.BusConnection type: %s' % bus
    assert isinstance(dbus_props, dict), 'dbus_props is not dict type: %s' % dbus_props
    try:
        interface = bus.get_object(dbus_props['service'], dbus_props['objectPath'])
        proxy = interface.get_dbus_method(dbus_props['methodUnSet'], dbus_props['interface'])
        proxy(cookie)
        print('Release inhibit Suspend')
        return None
    except dbus.exceptions.DBusException:
        print('Release inhibit Suspend failed.')
        return (cookie, bus, dbus_props)

if __name__ == '__main__':
    cookie, bus, dbus_props = inhibitSuspend()
    print('do something here')
    sleep(10)
    unInhibitSuspend(cookie, bus, dbus_props)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.