រង្វិលជុំរង់ចាំរបស់យើងបានរង់ចាំរយៈពេល 35 ម៉ោងសម្រាប់ខ្លួនឯង៖ pgrep -f និង pkill -f តាមរយៈ SSH
ប្រតិបត្តិការ
នៅថ្ងៃទី 31 ខែតុលា យើងបានចាប់ផ្តើមរង្វិលជុំតូចមួយតាមរយៈ SSH៖ រង់ចាំរហូតដល់ការងារបកប្រែនៅលើម៉ាស៊ីនផ្សេងទៀតបញ្ចប់ បន្ទាប់មកដំណើរការការងារបន្ត។ ការងារបកប្រែបានបញ្ចប់នៅយប់នោះ។ នៅពេលដែលយើងពិនិត្យម្តងទៀតពីរថ្ងៃក្រោយមក រង្វិលជុំបានរង់ចាំរយៈពេល 35 ម៉ោង ហើយការងារបន្តមិនបានដំណើរការសោះ។
អ្វីដែលរង្វិលជុំនោះបានធ្វើ
ssh build-host 'while pgrep -f "i18n_job.py example.com" >/dev/null; do sleep 30; done; ./follow-up.sh'
pgrep -f ផ្គូផ្គងលំនាំទៅនឹងបន្ទាត់ពាក្យបញ្ជាពេញលេញនៃដំណើរការនីមួយៗ។ SSH ដំណើរការពាក្យបញ្ជាដែលបានដាក់សញ្ញាសម្រង់ជា bash -c 'while pgrep -f "i18n_job.py example.com" …' ហើយបន្ទាត់ពាក្យបញ្ជានោះមានផ្ទុកលំនាំ។ pgrep មិនរាប់បញ្ចូលដំណើរការរបស់វាខ្លួនឯងក្នុងលទ្ធផលទេ ប៉ុន្តែមិនមែនជា shell ដែលបានចាប់ផ្តើមវាទេ។ ដូច្នេះ ដរាបណារង្វិលជុំនៅតែដំណើរការ វានឹងរកឃើញការផ្គូផ្គង៖ ខ្លួនឯង។
ភាពដូចគ្នា៖ pkill -f សម្លាប់ shell ដែលវាដំណើរការនៅក្នុងនោះ
អ្វីដែលដូចគ្នាកើតឡើងជាមួយ pkill -f ជាមួយនឹងលទ្ធផលអាក្រក់ជាង៖
ssh build-host 'pkill -f "worker.py --queue a"; nohup python3 worker.py --queue a &'
បន្ទាត់ពាក្យបញ្ជារបស់ shell ខ្លួនឯងមានផ្ទុកលំនាំ ដូច្នេះ pkill សម្លាប់ shell។ កម្មវិធី worker ត្រូវបានបញ្ឈប់ ហើយមិនត្រូវបានចាប់ផ្តើមឡើងវិញទេ ហើយ SSH ចេញក្រៅជាមួយកូដ 255 ដោយគ្មានសារកំហុស។ វាហាក់ដូចជាបញ្ហាសញ្ញាសម្រង់ ដែលជាអ្វីដែលយើងបានគិតថាជាបញ្ហានោះនៅពេលដំបូង។
ចន្លោះខែកញ្ញា និងចុងខែតុលា យើងបានជួបប្រទះមួយក្នុងចំណោមបញ្ហាទាំងពីរនេះយ៉ាងតិចម្តងដប់ពីរ៖ ការចាប់ផ្តើមឡើងវិញដែលមិនបានកើតឡើង រង្វិលជុំមួយដែលបានរក្សាពិនិត្យរយៈពេលបីម៉ោងកន្លះ មួយទៀតដែលបានរក្សាជួរការងារបកប្រែរយៈពេល 50 នាទី និងករណីនេះ។
អ្វីដែលយើងធ្វើឥឡូវនេះ
- វង់ក្រចកនៅក្នុងលំនាំ៖
pgrep -f "[i]18n_job.py example.com"។ ជាអនុក្រឹត្យទ្រឹស្តី វង់ក្រចក[i]ផ្គូផ្គងអក្សរ i ដូច្នេះការងារនៅតែផ្គូផ្គង; បន្ទាត់ពាក្យបញ្ជារបស់ shell មានផ្ទុកតួអក្សរ[i]ដែលអនុក្រឹត្យទ្រឹស្តីមិនផ្គូផ្គង។ វាជួយបានតែលុះត្រាតែលំនាំធម្មតាមិនលេចឡើងនៅកន្លែងផ្សេងទៀតនៅលើបន្ទាត់នោះ៖ ពាក្យបញ្ជាចាប់ផ្តើមឡើងវិញនៅក្រោយនោះនៅលើបន្ទាត់ដូចគ្នានឹងផ្គូផ្គងម្តងទៀត។ - រក សម្លាប់ និងចាប់ផ្តើមនៅក្នុងការហៅ SSH ដាច់ដោយឡែកពីគ្នា។ ការហៅមួយបញ្ជីដំណើរការជាមួយ
pgrep -afការហៅបន្ទាប់សម្លាប់ PIDs ដែលវាបានបោះពុម្ព ការហៅទីបីចាប់ផ្តើមដំណើរការថ្មី។ - រង់ចាំលើ PID មិនមែនលំនាំទេ៖
tail --pid=1234 -f /dev/nullឬwhile kill -0 1234; do sleep 30; done។ - ល្អជាងនេះទៀត ចូរឱ្យ systemd គ្រប់គ្រងកិច្ចការ។ ដំណើរការវាជាឯកតាមួយ ហើយសួរ
systemctl is-activeឬចាប់ផ្តើមវាដោយsystemd-run --wait។ គ្មានគំរូណាមួយដែលអាចធ្វើខុសបានទេ។ - រាល់ការរង់ចាំត្រូវមានកាលកំណត់ (
timeout 3h) ហើយប្រាប់ពេលវេលាដែលវាបោះបង់។ រង្វិលជុំដែលគ្មានកាលកំណត់ បរាជ័យដោយស្ងាត់ៗ។
Factory Floor គឺជាឈុតកម្មវិធីដែលដំណើរការម៉ាស៊ីនរបស់យើង ដំណើរការតាមរយៈឯកតា systemd៖ វាមិនព្យាយាមស្វែងរកដំណើរការតាមបន្ទាត់ពាក្យបញ្ជាទេ។ រង្វិលជុំដែលធ្វើឱ្យយើងមានបញ្ហា គឺជាអ្វីដែលយើងវាយដោយដៃ។