چطور پروسه رو با nohup و screen فعال نگه داریم
وقتی با SSH به سرور وصل میشی و یه پروسه رو اجرا میکنی اگه اتصال قطع بشه یا پنجره ترمینال رو ببندی اون پروسه هم کیل میشه این برای کارایی مثل آپلود فایل حجیم بکاپ گیری طولانی یا اجرای یه اسکریپت طولانی فاجعست
nohup و screen دو تا راه حل ساده و کاربردی برای این مشکلن باهاشون میتونی پروسه رو طوری اجرا کنی که حتی بعد از قطع SSH هم به کارش ادامه بده
nohup چیه و چطور کار میکنه؟
nohup (No Hang Up) یه دستور سادست که پروسه رو از ترمینال جدا میکنه یعنی پروسه دیگه به ترمینال وابسته نیست و با بسته شدن ترمینال یا قطع SSH نمیمیره
استفاده ساده:
nohup command &
یه مثال واقعی:
nohup python3 backup.py &
وقتی این دستور رو میزنی خروجی برنامه توی فایل nohup.out ذخیره میشه پروسه توی بکگراند اجرا میشه و اگه SSH قطع بشه به کارش ادامه میده
چک کردن خروجی:
tail -f nohup.out
دیدن پروسه های در حال اجرا:
jobs ps aux | grep python3
خروجی رو به فایل دلخواه بفرستیم:
nohup python3 backup.py > backup.log 2>&1 &
اینجا خروجی عادی و خطاها هر دو توی backup.log ذخیره میشن
nohup کی به درد میخوره؟
یه دستور یا اسکریپت داری که میدونی چقدر طول میکشه
نمیخوای بعدا برگردی و وضعیتش رو چک کنی
فقط میخوای پروسه توی بک گراند بمونه و کارش رو تموم کنه
محدودیت nohup: بعد از اجرا دیگه نمیتونی برگردی و ببینی پروسه توی چه وضعیتیه فقط خروجی رو میتونی بخونی
screen چیه و چطور کار میکنه؟
screen یه ابزار قدرتمندتره مثل یه ترمینال مجازی که توی بک گراند باز میمونه میتونی توش پروسه اجرا کنی ازش جدا بشی (detach) و بعدا دوباره بهش وصل بشی (attach)
نصب screen:
sudo apt install screen
ساخت یه screen جدید:
screen -S myscript
الان یه ترمینال جدید باز میشه هر چی اینجا اجرا کنی حتی با قطع SSH هم میمونه
اجرای پروسه توی screen:
python3 long_script.py
جدا شدن از screen (بدون بستن پروسه):
Ctrl + A سپس D
برمیگردی به ترمینال اصلی ولی پروسه توی screen هنوز در حال اجراست
دیدن لیست screen های فعال:
screen -ls
وصل شدن دوباره به screen:
screen -r myscript
برمیگردی همون جایی که بودی و میتونی خروجی پروسه رو ببینی
کشتن یه screen:
screen -XS myscript quit
یا وقتی به screen وصلی exit بزن
screen کی به درد میخوره؟
میخوای بعدا برگردی و ببینی پروسه توی چه وضعیتیه
نیاز داری با پروسه تعامل کنی (مثلا ورودی بدی)
چندتا پروسه مختلف رو همزمان مدیریت میکنی
میخوای خروجی پروسه رو زنده ببینی نه از روی فایل لاگ