আমি কীভাবে ঘুমন্ত বাশ স্ক্রিপ্ট জাগাতে পারি?


27

sleepকমান্ডটি ব্যবহার করে বিরতি দেওয়া কোনও প্রক্রিয়া জাগানো কি সম্ভব ?


উদাহরণ হিসাবে, আপনাকে এই স্ক্রিপ্টটি বলতে দিন:

#!/bin/bash
echo "I am tired"
sleep 8h
echo "I am fresh :)"

30 মিনিটের পরে আপনি আবিষ্কার করেছেন যে আপনার থামার জন্য স্ক্রিপ্টের দরকার, এটি হ'ল আপনি ইচ্ছা করে sleep 30mপরিবর্তে লিখতেন ।

আপনি হয় কল kill PIDবা Ctrl+ টিপতে চান না C, যেহেতু শেষ আদেশটি কার্যকর করা হয়নি এবং আপনি ক্লান্ত থাকবেন।

প্রক্রিয়াটি থেকে জাগ্রত করার কোনও উপায় sleepবা সম্ভবত অন্য কোনও কমান্ড যা ওয়েগআপ সমর্থন করে? উভয় পটভূমি এবং অগ্রভূমি প্রক্রিয়াগুলির সমাধান স্বাগত।


13
চিত্কার এটিকে সত্যই উচ্চস্বরে।
ডোরকনব

2
@ ডুরকনব ইনগিং gawkসত্যিই কাজ করে না। sleepগতবার আমি একটি আইএনজি প্রক্রিয়া করেছি, আমি pushdবিছানা থেকে বেরিয়ে এসেছি ।
imallett

আপনার স্ক্রিপ্ট একটি #!লাইন অনুপস্থিত । এবং যে বিষয় কারণ আপনার প্রশ্নের উত্তর আছে কিনা কোন উপর নির্ভর করে -e#!লাইন।
ক্যাস্পারড

1
@ ক্যাস্পার্ড সম্পন্ন কৌতূহলের বাইরে: পতাকাটির কী প্রভাব আছে?
বিটেনাস

2
ডিফল্টরূপে একটি স্ক্রিপ্ট ত্রুটির পরে চলতে থাকবে। আপনি যদি ব্যবহার করেন #!/bin/bash -eতবে স্ক্রিপ্টটি ত্রুটির পরে বন্ধ হয়ে যাবে। কেবলমাত্র স্লিপ কমান্ডটি হত্যা করা বাশ দ্বারা একটি ত্রুটি হিসাবে বিবেচিত হবে। এর অর্থ ছাড়া -eআপনার প্রশ্নের একটি সহজ সরল উত্তর নেই। যদি -eএটি ব্যবহার করা হয়, তবে এটি আরও শক্ত হয়ে যায় কারণ আপনার ঘুম না করা ছাড়া ঘুম প্রক্রিয়াটি বন্ধ করা দরকার।
কাস্পারড

উত্তর:


47

যখন কোনও বাশ স্ক্রিপ্ট চলমান থাকে sleep, এখানে দেখতে কীভাবে pstreeদেখতে পারা যায়:

bash(10102)───sleep(8506)

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

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

# write the current session's PID to file
echo $$ >> myscript.pid

# go to sleep for a long time
sleep 1000

এবং তারপর আমরা বলতে পারেন pkillNuke থেকে sleepনীচে চলমান যে PID, দৃষ্টান্ত:

pkill -P $(<myscript.pid) sleep

আবার এটি কেবলমাত্র sleepসেই বাশ সেশনের অধীনে সরাসরি চলমান প্রক্রিয়াগুলিতে সীমাবদ্ধ করে চলেছে। যতক্ষণ না পিআইডি সঠিকভাবে লগইন হয়েছিল, এটি এটিকে killall sleepবা তার চেয়ে অনেক বেশি নিরাপদ করে তোলে pkill sleepযা সিস্টেমে কোনও প্রকার sleep প্রক্রিয়া (অনুমতির অনুমতি দেওয়ার অনুমতি) দিতে পারে।

আমরা সেই তত্ত্বটি নিম্নলিখিত উদাহরণ সহ প্রমাণ করতে পারি যেখানে আমাদের দুটি পৃথক বাশ সেশন রয়েছে, দুটি চলছে sleep। কেবলমাত্র আমরা উপরের-বাম বাশ সেশনের পিআইডি নির্দিষ্ট করে দিচ্ছি, কেবল sleepএটিই মারা গেছে।

এখানে চিত্র বর্ণনা লিখুন


বিকল্প পন্থাটি হ'ল sleepপটভূমির দিকে ধাক্কা দেওয়া, এর পিআইডি সঞ্চয় করা এবং তারপরে এটি অগ্রভাগে ফিরে আসা। লিপিটিতে:

sleep 1000 &
echo $! > myscript.sleep.pid
fg

এবং এটি হত্যা করতে:

kill $(<myscript.sleep.pid)

5

আপনি আপনার স্ক্রিপ্টটি কিল ইত্যাদি থেকে অন্যান্য সংকেতগুলি হ্যান্ডেল করতে ("ফাঁদ") লিখতে পারেন যাতে আপনি স্ক্রিপ্টগুলির আচরণটি প্রয়োজনমতো পরিবর্তন করতে পারেন। ম্যান বাশ দেখুন:

SIGNALS
   When  bash  is  interactive,  in the absence of any traps, it ignores SIGTERM (so that kill 0 does not
   kill an interactive shell), and SIGINT is caught and handled (so that the wait builtin  is  interrupt-
   ible).   In all cases, bash ignores SIGQUIT.  If job control is in effect, bash ignores SIGTTIN, SIGT-
   TOU, and SIGTSTP.

   Non-builtin commands run by bash have signal handlers set to the values inherited by  the  shell  from
   its  parent.   When  job  control is not in effect, asynchronous commands ignore SIGINT and SIGQUIT in
   addition to these inherited handlers.  Commands run as a result of  command  substitution  ignore  the
   keyboard-generated job control signals SIGTTIN, SIGTTOU, and SIGTSTP.

   The shell exits by default upon receipt of a SIGHUP.  Before exiting, an interactive shell resends the
   SIGHUP to all jobs, running or stopped.  Stopped jobs are sent SIGCONT to ensure that they receive the
   SIGHUP.   To  prevent the shell from sending the signal to a particular job, it should be removed from
   the jobs table with the disown builtin (see SHELL BUILTIN COMMANDS below) or  marked  to  not  receive
   SIGHUP using disown -h.

   If  the huponexit shell option has been set with shopt, bash sends a SIGHUP to all jobs when an inter-
   active login shell exits.

   If bash is waiting for a command to complete and receives a signal for which a trap has been set,  the
   trap  will not be executed until the command completes.  When bash is waiting for an asynchronous com-
   mand via the wait builtin, the reception of a signal for which a trap has been set will cause the wait
   builtin  to  return immediately with an exit status greater than 128, immediately after which the trap
   is executed.

4

আপনি কেবল ঘুমটি মেরে ফেলতে পারেন যা স্ক্রিপ্টের পরবর্তী লাইনে থাকবে:

pkill sleep

মনে রাখবেন এটি কেবল আপনার স্ক্রিপ্টে নয়, আপনার সিস্টেমে চলমান কোনও ঘুম প্রক্রিয়াটিকে হত্যা করবে।


1

আমার একটি ঘুমন্ত বাশ স্ক্রিপ্ট cronবুট থেকে শুরু হয়েছে । স্ক্রিপ্ট প্রতি মিনিটে জাগে এবং ইন্টারনেট থেকে প্রাপ্ত সূর্যোদয় এবং সূর্যাস্তের উপর ভিত্তি করে ল্যাপটপ প্রদর্শনের উজ্জ্বলতা সেট করে। পূর্ণ উজ্জ্বল এবং পূর্ণ ম্লান্ধের মধ্যে একটি ব্যবহারকারী কনফিগারযোগ্য রূপান্তর পর্বের জন্য পদক্ষেপগুলি 3 এবং 4, 5 বা প্রতি মিনিটে যা কিছু গণনা করা হয় তা হ্রাস করতে হবে।

অলি সংক্ষিপ্তভাবে pstreeতার উত্তরে স্পর্শ করেছিল তবে তা প্রত্যাখ্যান করেছিল কারণ এটি সমস্ত sleepদৃষ্টান্তকে হত্যা করবে । Pstree অপশন ব্যবহার করে অনুসন্ধান সংকুচিত করে এড়ানো যায়।

ব্যবহার করে pstree -hআমরা সম্পূর্ণ উত্তরাধিকারী দেখতে পাই:

$ pstree -h
systemd─┬─ModemManager─┬─{gdbus}
                      └─{gmain}
        ├─NetworkManager─┬─dhclient
                        ├─dnsmasq
                        ├─{gdbus}
                        └─{gmain}
        ├─accounts-daemon─┬─{gdbus}
                         └─{gmain}
        ├─acpid
        ├─agetty
        ├─atd
        ├─avahi-daemon───avahi-daemon
        ├─cgmanager
        ├─colord─┬─{gdbus}
                └─{gmain}
        ├─cron───cron───sh───display-auto-br───sleep
        ├─cups-browsed─┬─{gdbus}
                      └─{gmain}
        ├─dbus-daemon
        ├─fwupd─┬─3*[{GUsbEventThread}]
               ├─{fwupd}
               ├─{gdbus}
               └─{gmain}
        ├─gnome-keyring-d─┬─{gdbus}
                         ├─{gmain}
                         └─{timer}
        ├─irqbalance
        ├─lightdm─┬─Xorg───3*[{Xorg}]
                 ├─lightdm─┬─upstart─┬─at-spi-bus-laun─┬─dbus-daemon
                                                    ├─{dconf worker}
                                                    ├─{gdbus}
                                                    └─{gmain}
                                   ├─at-spi2-registr─┬─{gdbus}
                                                    └─{gmain}
                                   ├─bamfdaemon─┬─{dconf worker}
                                               ├─{gdbus}
                                               └─{gmain}
                                   ├─chrome─┬─2*[cat]
                                           ├─chrome─┬─chrome─┬─2*[chrome─┬─{Chrome_ChildIOT}]
                                                                      ├─5*[{CompositorTileW}]]
                                                                      ├─{Compositor}]
                                                                      ├─{GpuMemoryThread}]
                                                                      ├─{MemoryInfra}]
                                                                      ├─{Renderer::FILE}]
                                                                      ├─{TaskSchedulerRe}]
                                                                      └─{TaskSchedulerSe}]
                                                           ├─7*[chrome─┬─{Chrome_ChildIOT}]
                                                                      ├─5*[{CompositorTileW}]]
                                                                      ├─{Compositor}]
                                                                      ├─{GpuMemoryThread}]
                                                                      ├─{MemoryInfra}]
                                                                      ├─{Renderer::FILE}]
                                                                      ├─{ScriptStreamerT}]
                                                                      ├─{TaskSchedulerRe}]
                                                                      └─{TaskSchedulerSe}]
                                                           ├─chrome─┬─{Chrome_ChildIOT}
                                                                   ├─5*[{CompositorTileW}]
                                                                   ├─{Compositor}
                                                                   ├─{GpuMemoryThread}
                                                                   ├─{Media}
                                                                   ├─{MemoryInfra}
                                                                   ├─{Renderer::FILE}
                                                                   ├─{ScriptStreamerT}
                                                                   ├─{TaskSchedulerRe}
                                                                   └─{TaskSchedulerSe}
                                                           └─2*[chrome─┬─{Chrome_ChildIOT}]
                                                                       ├─5*[{CompositorTileW}]]
                                                                       ├─{Compositor}]
                                                                       ├─{GpuMemoryThread}]
                                                                       ├─{Renderer::FILE}]
                                                                       ├─{ScriptStreamerT}]
                                                                       ├─{TaskSchedulerRe}]
                                                                       └─{TaskSchedulerSe}]
                                                   └─nacl_helper
                                           ├─chrome─┬─chrome
                                                   ├─{Chrome_ChildIOT}
                                                   ├─{MemoryInfra}
                                                   ├─{TaskSchedulerSe}
                                                   └─{Watchdog}
                                           ├─{AudioThread}
                                           ├─{BrowserWatchdog}
                                           ├─{Chrome_CacheThr}
                                           ├─{Chrome_DBThread}
                                           ├─{Chrome_FileThre}
                                           ├─{Chrome_FileUser}
                                           ├─{Chrome_HistoryT}
                                           ├─{Chrome_IOThread}
                                           ├─{Chrome_ProcessL}
                                           ├─{Chrome_SyncThre}
                                           ├─{CompositorTileW}
                                           ├─{CrShutdownDetec}
                                           ├─{D-Bus thread}
                                           ├─{Geolocation}
                                           ├─{IndexedDB}
                                           ├─{LevelDBEnv}
                                           ├─{MemoryInfra}
                                           ├─{NetworkChangeNo}
                                           ├─{Networking Priv}
                                           ├─4*[{TaskSchedulerBa}]
                                           ├─6*[{TaskSchedulerFo}]
                                           ├─{TaskSchedulerSe}
                                           ├─{WorkerPool/3166}
                                           ├─{WorkerPool/5824}
                                           ├─{WorkerPool/5898}
                                           ├─{WorkerPool/6601}
                                           ├─{WorkerPool/6603}
                                           ├─{WorkerPool/7313}
                                           ├─{chrome}
                                           ├─{dconf worker}
                                           ├─{extension_crash}
                                           ├─{gdbus}
                                           ├─{gmain}
                                           ├─{gpu-process_cra}
                                           ├─{inotify_reader}
                                           ├─{renderer_crash_}
                                           ├─{sandbox_ipc_thr}
                                           └─{threaded-ml}
                                   ├─compiz─┬─{dconf worker}
                                           ├─{gdbus}
                                           ├─{gmain}
                                           └─8*[{pool}]
                                   ├─conky───6*[{conky}]
                                   ├─2*[dbus-daemon]

( .... many lines deleted to fit in 30k limit .... )

        ├─vnstatd
        ├─whoopsie─┬─{gdbus}
                  └─{gmain}
        └─wpa_supplicant

আপনি দেখতে পাচ্ছেন একটি সাধারণ উবুন্টু লগইনটিতে অনেকগুলি পিআইডি (প্রসেস আইডির) থাকে।

আমরা এটি ব্যবহার করে এটি আমাদের চলমান স্ক্রিপ্টে সংকুচিত করতে পারি:

$ pstree -g -p | grep display-auto
  |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(26552,1308)

আমরা দেখি:

  • cron একটি শেল শুরু হয়েছে (প্রক্রিয়া ID 1308 এবং সেশন ID 1308)
  • শেলটি আমাদের প্রোগ্রামটিকে আইডি 1321 এবং সেশন আইডি 1308 (শেলের সাথে মিলে) এর অধীনে চলমান কল করে program
  • আমাদের প্রোগ্রামটি sleepপ্রক্রিয়া আইডির আওতায় 26552 এবং আবার সেশন আইডি 1308 কল করে

এই মুহুর্তে আমরা ব্যবহার করতে পারি pkill -s 1308এবং এটি শেল, আমাদের প্রোগ্রাম display-auto-brightnessএবং sleepকমান্ড সহ পুরো অধিবেশনটিকে হত্যা করে । পরিবর্তে আমরা kill 26552কেবল ঘুমানোর কমান্ডটি ব্যবহার করে আমাদের প্রোগ্রামটিকে জাগ্রত করতে এবং উজ্জ্বলতা সামঞ্জস্য করতে বাধ্য করি।

টার্মিনালটিতে ম্যানুয়ালি এটিকে টাইপ করতে দেখেন:

───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree -g -p | grep display-auto
             |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(32362,1308)
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ sudo kill 32362
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree -g -p | grep display-auto
             |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(1279,1308)
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ sudo kill 1279
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree -g -p | grep display-auto
             |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(4440,1308)
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ 

পরবর্তী পদক্ষেপটি যখন ল্যাপটপ স্থগিত করা থেকে জেগে থাকে তখন তা করা। উদাহরণস্বরূপ, যখন idাকনাটি বন্ধ হয় তখন এটি পুরো গা dark় ছিল এবং পর্দার উজ্জ্বলতা "300" এ সেট করা হয়েছিল। Lাকনাটি খোলার পরে এটি দিবালোক হয় এবং উজ্জ্বলতা "2000" এ সেট করা দরকার। অবশ্যই প্রোগ্রামটি নিজের থেকে 1 থেকে 59 সেকেন্ডে জেগে উঠবে তবে তাত্ক্ষণিকভাবে উজ্জ্বলতা সেট করা এটি আরও আরামদায়ক।

আমি কোডটি লিখে দেওয়ার পরে স্থগিত / পুনঃসূচনা পোস্ট করব। আশা করি এই সপ্তাহান্তে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.