Linux-ში (და ზოგადად Unix-ის მსგავსი სისტემებში), exit code (ან return code, exit status) არის რიცხვი (0-255), რომელსაც  პროგრამა თავისი მუშაობის დასრულებისას უბრუნებს ოპერაციულ სისტემას.  მისი გამოყენება/ანალიზი პროგრამებისა თუ სკრიპტების მიერ ხდება სხვადასხვა მიზნით:  ავტომატიზაციისა, მონიტორინგის ანდა შეცდომების აღმოჩენა-დამუშავებისთვის.

ძირითადი პრინციპები

  1. 0 ნიშნავს „წარმატებას“ – პროგრამა/ბრძანება კორექტულად დასრულდა.
  2.  1-255 ნიშნავს შეცდომას ან სპეციფიკურ სიტუაციას

ლიტერატურაში, რომელიც დამწყებებზეა გათვლილი (როგორიცაა, მაგალითად Linux Essentials), ხშირად ნახსენებია მხოლოდ ორი exit code: 0 (ნული) და 1. 0 შესაბამისად ნიშნავს ბრძანების/სკრიპტის/პროგრამის წარმატებით დასრულებას, ხოლო 1 ნებისმიერ წარუმატებლობას. მართალია მარტივი ბრძანებების შემთხვევაში ეს ასეცაა, რეალურ პრაქტიკაში გხვდება exit code-ები 255ის ჩავლით

exit code წარმოადგენს 1 ბაიტიან (ან 8 ბიტიან კოდს). ამიტომ მისი მნიშვნელობა შეზღუდულია 255-ით.

სტანდარტიზებული თუ ნახევრადსტანდარტიზებული კოდები

  • 126: ბრძანება/ფაილი ნაპოვნაა, მაგრამ ვერ ხორციელდება (მაგალითად, არ არის executable).

  • 127: ბრძანება/ფაილი ვერ მოიძებნა (Command not found).
  • 128 + N: (ანუ 130, 131, 132, …) სიგნალით (signal) დასრულება. მაგალითად:
    • 130 (128 + 2) – პროგრამა დასრულდა SIGINT-ით (Ctrl+C).
    • 137 (128 + 9) – პროგრამა დასრულდა SIGKILL-ით (kill -9).
  • 255: ზოგჯერ აღნიშნავს „არასწორ“(exit) მნიშვნელობას, თუ პროგრამამ სცადა 256 ან მეტად დაბრუნება.

არსებობს მიღებული სტანდარტები, რომლებიც ზოგიერთ გავრცელებულ კოდს ფიქსირებულ დანიშნულებას ანიჭებენ, თუმცა რეალურად,  ეს მხოლოდ რეკომენდაციებია.  პროგრამისტი თავად წყვეტს, რა მნიშვნელობა მიანიჭოს კონკრეტულ გამოვლინებას.  მაგალითად 1 შეიძლება ერთ კონკრეტულ პროგრამაში ნიშნავდეს CONFIG-ის წაკითხვის შეუძლებლობას, ხოლო სხვა პროგრამაში  – სულ სხვა რამეს. თუმცა ჩემი პირადი და სუბიექტური რჩევა იქნება მაინც გაითვალისწინოთ მიღებული სტანდარტები.

ასე მაგალითად ბრძანება grep წარმატებული შესრულებისას აბრუნებს 0-ს, თუ ვერ იპოვა pattern – 1-ს,  ხოლო თუ ფაილი ორს. Bash-ის ბრძანებების შემთხვევაში exit code-ების განმარტებებს ნახავთ man ბრძანების მეშვეობით, ხოლო სხვა პროგრამების ან სკრიპტების მათ დოკუმენტაციაში.

$? (bash-ის სტანდარტული ცვლადი)

ბაშში ბრძანების შესრულების შემდეგ, სპეციალური ცვლადი $? შეინახავს ბოლო შესრულებული ბრძანების exit code-ს.

  • ls /folder-which-does-not-exist
  • echo $?  # 2 ან 1 ან სხვა – სპეციფიკის მიხედვით

რატომაა exit code მნიშვნელოვანი?

  1. შედეგის ავტომატური ანალიზი: თუ სკრიპტში გვინდა დავრწმუნდეთ, რომ წინა ნაბიჯი წარმატებით შესრულდა, გავაკონტროლებთ $? ძალიან ბევრ Bash/შელ-სკრიპტში ან ინსტალაციურ სკრიპტში ნახავთ „if [ $? -ne 0 ] then … fi“ სტრუქტურებს, რომლებიც სწორედ exit code-ის ანალიზზეა აგებული. მაგალითად:

cp file1 file2

if [[ $? -ne 0 ]]; then
echo “Operation Failed”
exit 1
else
echo “Operation Succeeded”
fi

  1. მონიტორინგი: სისტემის მონიტორინგის ინსტრუმენტები (Nagios, Icinga, Zabbix და ა.შ.) ხშირად ბრძანებით ამოწმებენ სერვისის სტატუსს. თუ ახლადგაშვებული ბრძანება აბრუნებს 0-ს, ყველაფერი რიგზეა; თუ არა – საჭიროა გარკვევა სიტუაციაში.

დასკვნითი რჩევები

  • გამოიყენეთ გააზრებული exit code-ები: თუ თქვენს აპლიკაციას ან სკრიპტს სხვადასხვა შესაძლო შეცდომა შეიძლება ჰქონდეს, თითოეულ შეცდომას (ან შეცდომათა კლასს) განსაკუთრებული კოდი მინიჭეთ, რომ შემდგომ ავტომატური ანალიზი უფრო ზუსტი იყოს.
  • 0 ყოველთვის ნიშნავს “Success”: ეს საერთო პრაქტიკაა, რომელსაც არ უნდა გადაუხვიოთ
  • სხვა რიცხვი ყოველთვისრაღაც ხარვეზია: თუმცა რა ხარვეზია, ამას უკვე დანარჩენი ლოგიკა აგვიხსნის, ან თვითონ პროგრამის დოკუმენტაცია.