আপনি কীভাবে এমন একটি সিস্টেমড সার্ভিস লিখবেন যা মেশিন শাটডাউন বা রিবুট বন্ধ করে দেয়? বিশেষত, এটি মেশিন শাটডাউনটি বিলম্বিত করা উচিত যতক্ষণ না এটি নিখুঁতভাবে প্রস্থান করে।
আমার একটি পরিষেবা আছে যা বন্ধ হতে 10 সেকেন্ড সময় নেয়: /usr/local/bin/shutdowntest.sh:
#!/bin/bash
SHUTDOWN=0
SHUTDOWN_TIME=10
TRAPPED_SIGNAL=
function onexit() {
TRAPPED_SIGNAL=$1
SHUTDOWN=1
}
for SIGNAL in SIGINT SIGTERM SIGHUP SIGPIPE SIGALRM SIGUSR1 SIGUSR2; do
trap "onexit $SIGNAL" $SIGNAL
done
echo >&2 "shutdowntest running"
while ((!SHUTDOWN || SHUTDOWN_TIME>0)); do
if [[ -n "$TRAPPED_SIGNAL" ]]; then
echo >&2 "shutdowntest received signal $TRAPPED_SIGNAL"
TRAPPED_SIGNAL=
elif ((SHUTDOWN)); then
echo >&2 "shutdowntest Shutting down: $SHUTDOWN_TIME more sleeps"
SHUTDOWN_TIME=$((SHUTDOWN_TIME-1))
sleep 1
else
sleep 10
fi
done
echo >&2 "shutdowntest Finished shutting down; quitting"
আমি টাইমআউটসটপসেককে /etc / সিস্টেমেড / সিস্টেমে / শাটডাউনস্টেস্টে সার্ভিস 15 এ সেট করেছি:
[Service]
ExecStart=/usr/local/bin/shutdowntest.sh
TimeoutStopSec=15
[Install]
WantedBy=multi-user.target
আমি যখন চালনা করি তখন sudo systemctl stop shutdowntest.service
পরিষেবাটি নিখুঁতভাবে বন্ধ করে দেয় /var/log/syslog
:
00:57:11 shutdowntest.sh[1980]: shutdowntest received signal SIGTERM
00:57:11 shutdowntest.sh[1980]: shutdowntest Shutting down: 10 more sleeps
00:57:11 systemd[1]: Stopping shutdowntest.service...
00:57:11 shutdowntest.sh[1980]: Terminated
00:57:11 shutdowntest.sh[1980]: shutdowntest Shutting down: 9 more sleeps
00:57:12 shutdowntest.sh[1980]: shutdowntest Shutting down: 8 more sleeps
00:57:13 shutdowntest.sh[1980]: shutdowntest Shutting down: 7 more sleeps
00:57:14 shutdowntest.sh[1980]: shutdowntest Shutting down: 6 more sleeps
00:57:15 shutdowntest.sh[1980]: shutdowntest Shutting down: 5 more sleeps
00:57:16 shutdowntest.sh[1980]: shutdowntest Shutting down: 4 more sleeps
00:57:17 shutdowntest.sh[1980]: shutdowntest Shutting down: 3 more sleeps
00:57:18 shutdowntest.sh[1980]: shutdowntest Shutting down: 2 more sleeps
00:57:19 shutdowntest.sh[1980]: shutdowntest Shutting down: 1 more sleeps
00:57:20 shutdowntest.sh[1980]: shutdowntest Finished shutting down; quitting
00:57:20 systemd[1]: Stopped shutdowntest.service.
কিন্তু যখন আমি sudo reboot
বা sudo shutdown now
মেশিনটি থাকি তখন পরিষেবাটি নিখুঁতভাবে প্রস্থান করার জন্য পর্যাপ্ত সময় ব্যতীত মারা যায় এবং / var / লগ / সিসলগটি কেবল 1s পরে শেষ হয়।
00:59:30 shutdowntest.sh[2014]: Terminated
00:59:30 shutdowntest.sh[2014]: shutdowntest received signal SIGTERM
00:59:30 shutdowntest.sh[2014]: shutdowntest Shutting down: 10 more sleeps
00:59:30 systemd[1]: Stopping shutdowntest.service...
মেশিনটি শাটডাউন বা পুনরায় বুট করার পরে পরিষেবাটি প্রস্থান করার সময় ( TimeoutSec
বা TimeoutStopSec
) সময় দেওয়া হয়েছে তা কীভাবে নিশ্চিত করবেন ?
journalctl -u shutdowntest.service
সরাসরি দেখার পরিবর্তে জার্নালে ( ) দিয়ে পরীক্ষা করতে পারেন/var/log/syslog
? আমি ভাবছি যদি আপনার সার্ভিসের আগে সিসলগ বন্ধ না করা হয় এবং তারপরে বাকি আউটপুটটি লগ না করা হয়