কোনও স্ক্রিপ্ট শেষ হওয়ার আগে উবুন্টুকে এমনভাবে সেট করা সম্ভব হয় যে এটি বন্ধ না হয়ে যায়?


15

আমি একটি স্ক্রিপ্টটি ব্যবহার করি একটি ডিস্ক থেকে অন্য ডিস্কে বিআরটিএফ বিভাজনের বর্ধিত ব্যাকআপ করতে।

স্ক্রিপ্টটি একটি দিনের এলোমেলো সময় ক্রোন.সপ্তাহে শুরু হয়েছিল।

স্ক্রিপ্টটি চলাকালীন আমি যদি সিস্টেমটি বন্ধ করে রাখি তবে আমি পুরানো ব্যাকআপগুলি সরিয়ে নিয়েছি এবং নতুন তৈরি না হওয়া নিয়ে সমস্যায় পড়ছি।

স্ক্রিপ্ট শেষ না হওয়া পর্যন্ত অপেক্ষা করার জন্য কি সিস্টেম সেটআপ করার কোনও উপায় আছে?

আমি সিস্টেমেড সহ উবুন্টু 16.04 ব্যবহার করছি।


জিইউআই কমান্ডগুলি ব্লক করার একটি উপায় রয়েছে। আমি তার জন্য একটি স্ক্রিপ্টিং পদ্ধতির করেছি। কিন্তু sudo ব্যবহারকারীর দ্বারা কমান্ড লাইনটি ব্লক করা সম্ভব নয় । আমি জিইউআইয়ের জন্য একটি অতীত উত্তর লিঙ্ক করব। আপনি যদি এটি আপনার প্রয়োজন অনুসারে কাস্টমাইজ করতে চান তা আমাকে জানান
সের্গি কলডায়াজনি


1
@ বাইটকম্যান্ডার সাবধান: সেগুলি প্রাক-সিস্টেমড।
রিনজুইন্ড

1
@ সার্জ সুন্দর একটি :) তবে systemd-inhibitচোখের দিকে কিছুটা সহজ নয় ? >: - ডি
রিনজউইন্ড

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

উত্তর:


20

উবুন্টু 16.04++ এর জন্য systemd (ডিফল্ট) ব্যবহার করে।

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 সিস্টেমড হার্ডওয়্যার idাকনা সুইচটির নিম্ন-স্তরের হ্যান্ডলিংকে বাধা দেয়।

আপনি সম্ভবত প্রতিরোধ করতে চান suspend, idleএবং hibernate


"প্যাকেজ ম্যানেজার" ব্যবহার করে উদাহরণ :

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

এর অনুরূপ আপনি নিজের সংস্করণটি কোড করতে পারেন এবং এই স্ক্রিপ্টের শেষে একটি "শাটডাউন" যুক্ত করতে পারেন (বা একটি শাটডাউন নির্ধারণ করার জন্য একটি উপায় যুক্ত করুন পরবর্তী ক্রিয়া হওয়া দরকার)।


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এখানে যে কথোপকথনটি হয়েছিল তা আড্ডায় সরানো হয়েছে
থমাস ওয়ার্ড

2

ইন BackInTime আমি সমস্ত প্রধান দেস কাজ করার দম্পতি বিভিন্ন 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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.