শাটডাউন করার ঠিক আগে সিস্টেমে স্ক্রিপ্ট চালাবেন কীভাবে?


58

[install]বিভাগটিতে আমার কী দরকার , যাতে সিস্টেমডটি /home/me/so.plশাটডাউন করার আগে এবং /proc/self/net/devধ্বংস হওয়ার আগেই চলে ?

[Unit]
Description=Log Traffic

[Service]
ExecStart=/home/me/so.pl

[Install]
?

উত্তর:


66

প্রস্তাবিত সমাধানটি হ'ল পরিষেবা ইউনিটটিকে একটি সাধারণ পরিষেবা হিসাবে চালানো - [Install]বিভাগটি দেখুন। সুতরাং সবকিছু বিপরীত, নির্ভরতাও চিন্তা করতে হবে। কারণ শাটডাউন অর্ডারটি বিপরীত প্রারম্ভিক ক্রম order এজন্য স্ক্রিপ্টটি রাখতে হবে ExecStop=

নিম্নলিখিত সমাধানটি আমার জন্য কাজ করছে:

[Unit]
Description=...

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>

[Install]
WantedBy=multi-user.target

RemainAfterExit=trueযখন আপনার কোনও ExecStartক্রিয়া নেই তখন প্রয়োজন is

ফাইলটি তৈরির পরে, নিশ্চিত হয়ে নিন systemctl daemon-reloadএবং systemctl enable yourservice --now

আমি কেবল এটি সিস্টেমড আইআরসি থেকে পেয়েছি, ক্রেডিটগুলি মেজকালেরোতে যাচ্ছে।


6
উবুন্টু 16.04 এ আপনার অবশ্যই একটি ExecStart=/bin/true
নিলস

3
যখন নেই তখনই আমার কেন অনুমিতি RemainAfterExit=trueপ্রয়োজন ExecStartকারণ এটি মনে করে যে পরিষেবাটি চলছে না তা systemdচালানোর চেষ্টা করবে না ExecStopRemainAfterExit=trueকারণ systemdথেকে বিশ্বাস যে সেবা চলছে, যার ফলে এটি চালানোর জন্য ঘটাচ্ছে ExecStopহরতাল হয়।
ফিলিপ আলভারেজ

1
ব্যবহারকারী সেশন এবং ব্যবহারকারীর প্রক্রিয়া শেষ হওয়ার আগে এই স্ক্রিপ্টটি চলবে এবং সম্পূর্ণ হবে তা নিশ্চিত করার কোনও উপায় আছে কি?
সমৃদ্ধম্ব

@ রিচম্ব মোটেও নয় থেকে ডক্স :Note that it is usually not sufficient to specify a command for this setting that only asks the service to terminate (for example, by queuing some form of termination signal for it), but does not wait for it to do so.
svenwltr

আমি এটি এবং এটির উপরে বিভিন্ন পুনরাবৃত্তি চেষ্টা করেছি কিন্তু এটি ডিবিয়ান স্ট্রেচে কাজ করে না।
2rs2ts

8

আমি যতদূর দেখতে পাচ্ছি এটি আমার যা প্রয়োজন তা করে (তবে ঠিক কেন জানি না)।

[Unit]
Description=Log Traffic
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target


[Service]
ExecStart=/usr/local/bin/perl /home/me/log_traffic.pl --stop
Type=oneshot

3
এটি 2 টি জিনিসের কারণে কাজ করে: 1) ডিফল্ট নির্ভরতা = না এটি সমস্ত নির্ভরতা উপেক্ষা করে "শুরুতে" প্রথমে "স্টপ" এবং "শেষ" স্টপ চালায়, সর্বদা "আগে" এবং "পরে" ধারাগুলির সম্মান করে। ২) শাটডাউন / রিবুট / থামানো লক্ষ্যগুলিতে কোনও পূর্ববর্তী ধারা রয়েছে বলে মনে হয়, তাই এটি শাটডাউন / রিবুট / হল্ট স্টপে পৌঁছানোর ঠিক আগে চলবে (কারণ তারা কেবল স্টপ চালায় এটি যা করতে চান তা ঘটে)।
আরডিপি

আপনি যোগ করতে চান করতে পারেন kexec.targetকরার আগে একটু
hanetzer

এটি আমার পক্ষে কাজ করে না
বাগ কিলার

আপনি যদি বিভাগে যুক্ত WantedBy=shutdown.target reboot.target halt.targetনা করেন তবে এটি কীভাবে কাজ করবে তা আমি দেখতে পাচ্ছি না [Unit]Before=& After=নির্ভরতা পরিবর্তন করবেন না।
আরএসও

1
@ ফিলিপআলভারেজ: আমি আমার মন্তব্য সরিয়েছি।
sid_com

7
  • যেকোন রিবুট / শাটডাউন / হাল্ট / কেক্সেক পরিষেবা শুরু করার আগে কোনও পরিষেবা চালানোর জন্য (যেমন শেষ মুহুর্তে রুট ফাইল সিস্টেম পুনরায় পঠনযোগ্য হয়ে উঠার আগে) এই পরিষেবা কনফিগারেশনটি ব্যবহার করুন:

    [Unit]
    Description=Save system clock on shutdown
    DefaultDependencies=no
    After=final.target
    
    [Service]
    Type=oneshot
    ExecStart=/usr/lib/systemd/scripts/fake-hwclock.sh save
    
    [Install]
    WantedBy=final.target
    

    এটি দিয়ে এটি সক্ষম করুন:

    systemctl enable my_service.service
    
  • প্রকৃত রিবুট / শাটডাউন / হলট / কেেক্সেকের ঠিক আগে স্ক্রিপ্ট চালানো (যখন আপনি রুট ফাইল সিস্টেমে লিখতে পারবেন না, কারণ এটি কেবল পঠনযোগ্য পুনরায় সঞ্চারিত হয়েছিল) /usr/lib/systemd/system-shutdownডিরেক্টরিতে এই স্ক্রিপ্টটি এক্সিকিউটেবল যুক্ত করুন ।

    প্রকৃত সিস্টেম হোল্ট / পাওয়ার অফ / রিবুট / কেেক্সেক সিস্টেমড-শাটডাউন কার্যকর করার পূর্বে / ইউএসআর / লাইব / সিস্টেমড / সিস্টেম-শাটডাউন / এ সমস্ত এক্সিকিউটেবল চালিত হবে এবং তাদের কাছে একটি আর্গুমেন্ট পাস করবে: হয় "থাম", "পাওয়ার অফ", "রিবুট "বা" কেক্সেক ", নির্বাচিত ক্রিয়াটির উপর নির্ভর করে। এই ডিরেক্টরিতে সমস্ত এক্সিকিউটেবল সমান্তরালভাবে কার্যকর করা হয় এবং সমস্ত এক্সিকিউটেবল শেষ হওয়ার আগে ক্রিয়াকলাপ কার্যকর করা হয় না।

আরও দেখুন:

https://www.freedesktop.org/software/systemd/man/bootup.html

https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html


1
আমি আগে রিবুট শুরু করার পরে যতটা সম্ভব কাছাকাছি কিছু কার্যকর করতে চাই final.target। আদর্শভাবে আমি চাই যে ব্যবহারকারী এটি করার পরে এটিই প্রথম কার্যকর করা হবে $ sudo reboot
জাইমে হাবলুটজেল

5

আমি পুরোপুরি নিশ্চিত নই তবে আমি মনে করি না যে আপনার ইনস্টল অংশটি প্রয়োজন যদিও আমি এটি স্পষ্টভাবে যুক্ত করেছি। আমি এটিও পরীক্ষা করে দেখিনি তবে আমার মনে হয় এটি আপনাকে শুরু করতে সহায়তা করবে:

[Unit]
Description=Log Traffic
Requires=network.target
After=network.target
Before=shutdown.target
DefaultDependencies=no

[Service]
ExecStart=/home/me/so.pl
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=shutdown.target

আমি যখন এটি চেষ্টা করি তখন স্ক্রিপ্টটি শুরু হওয়ার (বুট) এর সাথে সাথেই কার্যকর হয়ে যায়।
sid_com

@sid_com থ্রেড.gmane.org/gmane.comp.sysutils.systemd.devel/4515/… পড়ার পরে ডিফল্ট নির্ভরতা = না যোগ করার চেষ্টা করুন এবং সম্ভবত ইনস্টল বিভাগটি সরিয়ে ফেলুন। অন্যথায় এটি লাইনগুলির পরে / রিমোট করতে সহায়তা করতে পারে।
উলিচ ড্যাঞ্জেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.