रिमोट VPS पर tmux में Claude Code चलाएँ
हमेशा चालू Linux VPS पर tmux के भीतर Claude Code चलाएँ, ताकि SSH कनेक्शन टूटने पर भी एजेंट सेशन चलते रहें। इंस्टॉल, हार्डनिंग और संभावित फ़ेल्योर मोड, सब यहाँ।
समस्या लैपटॉप का ढक्कन है, CLI नहीं
Claude Code आपके लैपटॉप पर तब तक बढ़िया चलता है जब तक आप ढक्कन बंद नहीं कर देते: SSH सेशन मर जाता है, शेल को SIGHUP मिलता है, और टेस्ट रन में तीन मिनट आगे बढ़ चुका एजेंट भी उसके साथ मर जाता है। CLI को ऐसी मशीन पर चलाएँ जो कभी सोती नहीं, एक ऐसे टर्मिनल मल्टीप्लेक्सर के भीतर जिसकी प्रोसेस आपके SSH सेशन की child नहीं हैं। बस यही पूरी तरकीब है — और असली वज़न इंस्टॉल नहीं, tmux उठाता है।
यह पेज उस मशीन को चलाने के बारे में है जिस पर आप एजेंट चलते छोड़ जाते हैं। अगर आपके पास कोई ऐसा Linux सर्वर नहीं है जिसे आप चालू छोड़ सकें, तो इसमें से कुछ भी लागू नहीं होता। यही इकलौती ईमानदार शर्त है।
tmux असल में करता क्या है
जब आप SSH से भीतर आते हैं, तो sshd fork करके एक शेल बनाता है और उसे एक स्यूडो-टर्मिनल (pty) थमा देता है; उस शेल से आप जो भी शुरू करते हैं, वह उसकी child प्रोसेस होती है। कनेक्शन टूटते ही कर्नेल pty को ढहा देता है, शेल को SIGHUP मिलता है, और वह आगे अपनी child प्रोसेसों पर भी फ़ोन पटक देता है। देर तक चलने वाली फ़ोरग्राउंड प्रोसेस मर जाती हैं।
tmux इस मालिकाने को उलट देता है। आप जो tmux कमांड टाइप करते हैं, वह एक हल्का क्लाइंट है, जो एक unix सॉकेट के ज़रिए उस tmux सर्वर से बात करता है जो आपके टर्मिनल से अलग होकर (detached) चलता है। सेशन के भीतर के शेल उस सर्वर की child प्रोसेस हैं, sshd की नहीं। SSH कनेक्शन काट दें, तो क्लाइंट ग़ायब हो जाता है जबकि सर्वर, सेशन और आधे काम में लगा एजेंट चलते रहते हैं। दोबारा कनेक्ट करें, tmux attach चलाएँ, और आप उसी शेल में, उसी स्क्रॉलबैक के साथ वापस पहुँच जाते हैं। nohup भी hangup झेल जाता है, पर वापसी का कोई रास्ता नहीं देता — बैकग्राउंड में गए किसी TUI से आप दोबारा जुड़ नहीं सकते। Claude Code इंटरैक्टिव है; tmux (या screen) ही सही औज़ार है।
मशीन का साइज़ तय करना
CLI एक Node प्रोसेस है; मशीन को वह नहीं भरती। मशीन को भरता है वह सब कुछ जो एजेंट आपकी ओर से चलाता है: एक बिल्ड, पूरा टेस्ट सुइट, tsc, एक लैंग्वेज सर्वर, Docker में चलता कोई डेटाबेस। साइज़ टूलचेन के हिसाब से चुनें, CLI के हिसाब से नहीं। swap ज़रूर जोड़ें, भले ही उसे कभी छूने का इरादा न हो — यह अचानक आने वाली OOM kill को एक धीमी बिल्ड में बदल देता है:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstabडिस्क पर भी नज़र रखें: रिपॉज़िटरी, node_modules और Docker इमेज तेज़ी से जमा होती हैं। और अगर टूलचेन कंटेनरों से आगे बढ़कर पूरी वर्चुअल मशीनों तक पहुँचती है — कोई KVM गेस्ट, कोई लोकल Kubernetes नोड — तो प्लान पक्का करने से पहले जाँच लें कि वह CPU के वर्चुअलाइज़ेशन एक्सटेंशन उपलब्ध कराता है, क्योंकि VPS पर nested virtualization चलाना कुछ ऐसा है जिसे प्रोवाइडर आपके लिए चालू करता है, न कि कुछ ऐसा जिसे आप गेस्ट के भीतर से ख़ुद खोल लें।
सबसे पहले एक non-root यूज़र
अपनी अलग होम डायरेक्टरी वाला एक समर्पित यूज़र बनाएँ, और अपनी पब्लिक कुंजी (public key) उसकी जगह पर रख दें:
sudo adduser --disabled-password --gecos "" agent
sudo install -d -m 700 -o agent -g agent /home/agent/.ssh
sudo cp ~/.ssh/authorized_keys /home/agent/.ssh/authorized_keys
sudo chown agent:agent /home/agent/.ssh/authorized_keys
sudo chmod 600 /home/agent/.ssh/authorized_keysजान-बूझकर agent को sudo ग्रुप में नहीं रखा गया है। कोई सिस्टम पैकेज चाहिए हो, तो उसे आप ख़ुद इंस्टॉल करते हैं। अकेला यही फ़ैसला उन ज़्यादातर रास्तों को बंद कर देता है जिनसे कोई भटकी हुई शेल कमांड होस्ट को तबाह कर सकती है।
हमेशा चालू रहने वाली मशीन के लिए SSH की साफ़-सफ़ाई
जो मशीन दिन-रात पब्लिक इंटरनेट पर बैठी है और जिस पर एक एजेंट और आपका सोर्स कोड रखा है, उस पर पासवर्ड ऑथेंटिकेशन ऐसा जोखिम नहीं है जिसे ढोया जाए। इसे बंद कर दें। Ubuntu 24.04 और Debian 13 पर /etc/ssh/sshd_config में /etc/ssh/sshd_config.d/*.conf शामिल होता है, इसलिए मुख्य कॉन्फ़िग बदलने के बजाय वहाँ एक फ़ाइल डाल दें:
# /etc/ssh/sshd_config.d/10-hardening.conf
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin noजाँचें और रीलोड करें — अपना मौजूदा सेशन खुला रखते हुए, जबकि आप दूसरे टर्मिनल से एक नया सेशन आज़माते हैं:
sudo sshd -t && sudo systemctl restart sshUbuntu 24.04 की एक बारीकी: sshd सॉकेट-ऐक्टिवेटेड है। ऑथेंटिकेशन की सेटिंग्स systemctl restart ssh से लागू हो जाती हैं, लेकिन सुनने वाले Port में बदलाव के लिए systemctl daemon-reload और ssh.socket का रीस्टार्ट भी चाहिए।
फिर फ़ायरवॉल। उसे चालू करने से पहले SSH को अनुमति दें, वरना आप ख़ुद को ही बाहर कर बैठेंगे:
sudo ufw allow OpenSSH
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enablefail2ban इंस्टॉल करें, पर साफ़ समझ के साथ कि वह आपको क्या देता है: पासवर्ड ऑथेंटिकेशन बंद हो जाने पर ब्रूट फ़ोर्स वैसे भी कामयाब नहीं हो सकता — यह बस नाकाम कोशिशों को आपके journal से बाहर रखता है।
# /etc/fail2ban/jail.local
[sshd]
enabled = true
backend = systemd
maxretry = 5
bantime = 1hआख़िर में, sudo apt install unattended-upgrades और sudo dpkg-reconfigure -plow unattended-upgrades से पैच अपने-आप लगने दें। tmux के साथ इसके टकराव पर ध्यान दें: Unattended-Upgrade::Automatic-Reboot चालू करेंगे, तो कोई कर्नेल अपडेट मशीन को रीबूट कर देगा और हर सेशन साथ ले डूबेगा। इसे बंद रखें और अपने तय वक़्त पर रीबूट करें, जब बीच में कुछ भी न चल रहा हो।
Ubuntu पर Node.js और Claude Code इंस्टॉल करें
Claude Code एक Node CLI है, इसलिए आपको Node का कोई ताज़ा वर्ज़न चाहिए। डिस्ट्रो का पैकेज अक्सर पीछे चलता है; Ubuntu और Debian पर NodeSource ही आम रास्ता है, और वह एक साइन की हुई रिपॉज़िटरी देता है (कोई apt-key नहीं — वह टूल अब है ही नहीं):
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt install -y nodejs
node --versionअब वह हिस्सा जो लोग ग़लत कर बैठते हैं: CLI को अपने agent यूज़र के तौर पर इंस्टॉल करें, कभी भी sudo npm -g से नहीं। root के मालिकाना हक़ वाला ग्लोबल prefix बाद में परमिशन एरर देता है और npm कैश में root की फ़ाइलें छोड़ जाता है। पहले npm का prefix यूज़र की होम डायरेक्टरी पर सेट करें:
mkdir -p ~/.npm-global
npm config set prefix ~/.npm-global
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
npm install -g @anthropic-ai/claude-code
claude --versionयह export ~/.bashrc में जाता है, ~/.profile में नहीं, और इसे फ़ाइल के ऊपर की ओर मौजूद "If not running interactively, don't do anything" वाले guard से ऊपर होना चाहिए: tmux non-login शेल शुरू कर सकता है, जो ~/.bashrc पढ़ते हैं और ~/.profile छोड़ देते हैं — ~/.profile सिर्फ़ login शेल के लिए चलता है। nvm जैसे वर्ज़न मैनेजर से प्रति-यूज़र Node भी वही नतीजा देता है; रास्ता जो भी हो, लक्ष्य यह है कि npm install -g को कभी sudo की ज़रूरत न पड़े। npm अब भी ठीक काम करता है, या Anthropic की नेटिव इंस्टॉल स्क्रिप्ट इस्तेमाल करें, जो इस समय दस्तावेज़ों में डिफ़ॉल्ट तरीक़ा है। पेस्ट करने से पहले Anthropic के इंस्टॉल दस्तावेज़ देख लें — इंस्टॉल के तरीक़े बदलते रहते हैं।
किसी रिपॉज़िटरी के भीतर claude चलाकर उसे शुरू करें। पहला रन आपको ऑथेंटिकेशन से गुज़ारता है; बिना मॉनिटर वाली (headless) मशीन पर कोई ब्राउज़र नहीं होता, इसलिए यह फ़्लो आपको एक URL देता है जिसे आप अपनी मशीन पर खोलते हैं, और एक कोड जिसे टर्मिनल में वापस लाना होता है। (एनवायरनमेंट में रखी एक API कुंजी दूसरा रास्ता है।) रास्ता जो भी हो, वह क्रेडेंशियल अब सर्वर पर रहता है — और यही हमें उस हिस्से तक ले आता है जिसे लोग छोड़ जाते हैं।
नुक़सान के दायरे (blast radius) की बात
शेल एक्सेस वाला एजेंट ख़ुद एक शेल है। वह जिस यूज़र के तौर पर चलता है, उसकी पढ़ने लायक़ हर चीज़ पढ़ सकता है, और जहाँ-जहाँ वह यूज़र push कर सकता है, वहाँ push कर सकता है। यह टूल की आलोचना नहीं है, यही उसकी परिभाषा है — और इसीलिए वह किस अकाउंट के तहत चलता है, यह बात किसी भी अकेली सेटिंग से ज़्यादा मायने रखती है।
- समर्पित, बिना विशेषाधिकार वाला यूज़र। कोई
sudoग्रुप नहीं, आपके अपने अकाउंट के साथ साझा कोई होम डायरेक्टरी नहीं। - मशीन पर कोई प्रोडक्शन क्रेडेंशियल नहीं। prod कुंजियाँ रखने वाला कोई
~/.aws/credentialsनहीं, प्रोडक्शन से उतारा हुआ कोई.envनहीं, किसी भी अहम चीज़ पर write एक्सेस रखने वाला कोई डेटाबेस पासवर्ड नहीं। एजेंट को स्टेजिंग या read-only क्रेडेंशियल दें। - सीमित दायरे के टोकन। एक ही रिपॉज़िटरी तक सीमित fine-grained GitHub टोकन; जब read एक्सेस काफ़ी हो, तो एक deploy key (सिर्फ़ उसी रिपॉज़िटरी के लिए दर्ज SSH कुंजी)।
Claude Code में एक फ़्लैग आता है जो उसके परमिशन प्रॉम्प्ट पूरी तरह छोड़ देता है। लैपटॉप पर, किसी फेंकने लायक़ प्रोजेक्ट में, यह आपका फ़ैसला है। टोकनों वाले सर्वर पर यह उस आख़िरी चीज़ को हटा देता है जो एक ग़लत पढ़ी गई हिदायत और git push --force के बीच खड़ी है। यह फ़्लैग असल में क्या बदलता है, और इसके साथ चलने वाले एजेंट को — बिल्ट-इन सैंडबॉक्स से लेकर एक डिस्पोज़ेबल VPS तक — कैसे क़ाबू में रखा जाए, यह सब सर्वर पर Claude Code को सुरक्षित ढंग से चलाना में शामिल है।
Deploy key बनाम SSH एजेंट फ़ॉरवर्डिंग
ssh -A से लॉगिन करने का मन ललचाता है, ताकि git आपके लैपटॉप वाली कुंजी इस्तेमाल कर सके। समझ लें कि यह क्या दे बैठता है: एजेंट फ़ॉरवर्डिंग आपके लोकल SSH एजेंट (ssh-agent) का सॉकेट मशीन पर उस यूज़र के तौर पर चल रही प्रोसेसों के सामने खोल देती है। agent के तौर पर चल रही कोई भी चीज़ — वह एजेंट भी — जब तक आप जुड़े हुए हैं, आपकी कुंजी से किसी भी पहुँच में आने वाले होस्ट के लिए साइन करवा सकती है। यह "git को बस यही एक रिपॉज़िटरी pull करने दो" से कहीं ज़्यादा है।
इसके बजाय सर्वर पर एक कुंजी बनाएँ, उसे प्रति-रिपॉज़िटरी deploy key के तौर पर दर्ज करें (write एक्सेस सिर्फ़ तब, जब एजेंट को push करना ही हो), और एक git पहचान सेट करें ताकि इस मशीन से आए commit पहचाने जा सकें:
ssh-keygen -t ed25519 -C "agent deploy key" -f ~/.ssh/id_ed25519_repo
cat ~/.ssh/id_ed25519_repo.pub # paste into the repo's Deploy Keys
git config --global user.name "Agent (build box)"
git config --global user.email "agent@example.com"tmux वर्कफ़्लो
इसे इंस्टॉल करें (sudo apt install tmux), फिर एक छोटा-सा ~/.tmux.conf:
set -g mouse on
set -g history-limit 50000
set -g default-terminal "tmux-256color"चार कमांड रोज़मर्रा का काम संभाल लेती हैं:
tmux new -A -s claude # attach to session "claude", creating it if absent
# ...run `claude` inside it, work normally...
# Ctrl-b then d -> detach; everything keeps running
tmux ls # list sessions
tmux attach -t claude # reattach, from this machine or any other
tmux kill-session -t claudeयाद रखने लायक़ कमांड tmux new -A -s claude है — सेशन मौजूद हो तो उससे जुड़ जाती है, न हो तो बना देती है, यानी एक ही कमांड दिन की शुरुआत और कनेक्शन टूटने के बाद की वापसी, दोनों संभालती है। इसका alias बना लें। सेशन के भीतर Ctrl-b c नई विंडो खोलता है, Ctrl-b n और Ctrl-b p उनके बीच घुमाते हैं, और Ctrl-b [ स्क्रॉलबैक देखने के लिए copy mode में ले जाता है (q से बाहर)।
फ़ेल्योर मोड
"मेरा सेशन ग़ायब है।" tmux ls छापता है no server running on /tmp/tmux-1000/default। इसका मतलब लगभग हमेशा यह होता है कि प्रोसेस कभी tmux के भीतर थी ही नहीं — आपने SSH किया, सीधे claude चला दिया, और डिस्कनेक्ट ने उसे मार दिया। वापस पाने को कुछ नहीं। जो आदत इससे बचाती है: हर लॉगिन के बाद पहली कमांड tmux new -A -s <project> हो।
पेन (pane) सिकुड़कर छोटा-सा डिब्बा बन जाता है। tmux सेशन का आकार सबसे छोटे जुड़े हुए क्लाइंट के हिसाब से रखता है, इसलिए किसी दूसरी मशीन से अब भी जुड़ा हुआ पुराना क्लाइंट डिस्प्ले को निचोड़ देता है। जुड़ते समय बाक़ियों को ज़बरदस्ती हटाएँ: tmux attach -d -t claude।
बिल्ड Killed छापती है। एक शब्द, कोई स्टैक ट्रेस नहीं। sudo dmesg -T | grep -i -E 'out of memory|killed process' से पुष्टि करें — कर्नेल के OOM killer (मेमोरी ख़त्म होने पर प्रोसेस मारने वाले हिस्से) ने सबसे बड़ी प्रोसेस चुन ली। Node की ओर से आपको इसकी जगह FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory दिख सकता है। उपाय, क्रम से: swap जोड़ें (ऊपर देखें), टेस्ट और कंपाइलर का पैरेललिज़्म घटाएँ, NODE_OPTIONS=--max-old-space-size=... से Node की हीप बढ़ाएँ, या VPS का साइज़ बढ़ा लें। OOM killer बिल्ड की जगह tmux सर्वर को भी चुन सकता है और आपका सेशन साथ ले जा सकता है; अगर systemd-oomd चल रहा है, तो वह पूरा user slice (उस यूज़र की सारी प्रोसेसों का समूह) मारकर वही असर कर सकता है।
npm error code EACCES / permission denied, mkdir '/usr/lib/node_modules/...'। root के मालिकाना हक़ वाले prefix में की गई ग्लोबल इंस्टॉल। ऊपर वाला ~/.npm-global prefix इस्तेमाल करें। अगर आपने कभी sudo npm चला दिया था, तो Your cache folder contains root-owned files भी दिख सकता है — sudo chown -R $(id -u):$(id -g) ~/.npm से ठीक करें।
claude: command not found — पर सिर्फ़ कभी-कभी। आपका PATH export ~/.bashrc में "If not running interactively, don't do anything" guard के नीचे पड़ा है, इसलिए non-interactive शेल उसे छोड़ देते हैं। export को उस guard के ऊपर ले जाएँ और उसे ~/.bashrc में ही रखें, ~/.profile में नहीं: tmux non-login शेल शुरू कर सकता है, जो ~/.bashrc पढ़ते हैं और ~/.profile को कभी हाथ नहीं लगाते।
जुड़ने के बाद रंग बिगड़े हुए। TERM का बेमेल — ऊपर वाली default-terminal लाइन ही इलाज है।
रीबूट के बाद सेशन ग़ायब। यह बग नहीं है: tmux सर्वर एक प्रोसेस है, और रीबूट उसे ख़त्म कर देता है। uptime देख लें।
जैसे-जैसे यह बढ़ता है, क्या-क्या टूटता है
ज़्यादा प्रोजेक्ट। हर रिपॉज़िटरी के लिए उसी के नाम का एक tmux सेशन; फिर tmux ls ही आपका डैशबोर्ड है। नामकरण का यह अनुशासन छोड़ेंगे, तो 0, 1, 2 नाम के सेशन मिलेंगे। पोर्ट भी इसी तरह फैलते हैं — छह रिपॉज़िटरी, सबको :3000 चाहिए, यही वह मोड़ है जहाँ पोर्ट हाथ से बाँटना बंद करके होस्टनेम के आधार पर बँटवारे का काम Docker Compose के तहत कई ऐप्स रूट करने वाले एक Traefik रिवर्स प्रॉक्सी को सौंप देना चाहिए।
ज़्यादा लोग। tmux सॉकेट प्रति-यूज़र होते हैं, इसलिए एक ही मशीन पर दो डेवलपर के अपने-अपने tmux सर्वर होते हैं और वे एक-दूसरे के सेशन नहीं देख सकते। साझा सॉकेट पर एक ही सेशन बाँटने का मतलब है कि सब लोग एक ही Unix यूज़र के तौर पर एक ही शेल में टाइप कर रहे हैं — ऑडिट और परमिशन के उन नतीजों समेत जो इसके साथ आते हैं। अलग-अलग यूज़र ही उबाऊ, मगर सही जवाब है।
बिना निगरानी का काम। tmux उन इंटरैक्टिव सेशनों के लिए है जिनसे आप जुड़ते हैं। जो जॉब तय समय पर, बिना किसी के देखे चलते हैं, उनकी जगह एक systemd यूनिट और टाइमर में है, जहाँ लॉगिंग, restart पॉलिसी और बूट के बाद बचे रहना मुफ़्त में मिलता है। cron-जैसे जॉब के लिए tmux उठाना इस बात का संकेत है कि वह जॉब सर्विस बनना चाहता है।
एक आख़िरी बात: एजेंट जो dev सर्वर शुरू करता है, उन्हें 0.0.0.0 पर नहीं, 127.0.0.1 पर बाइंड करें, और ufw में पोर्ट खोलने के बजाय उन तक SSH टनल (ssh -L 3000:127.0.0.1:3000 agent@your-server) से पहुँचें। जब आप आधा दर्जन पोर्ट फ़ॉरवर्ड करने लगें, या एक फ़ोन और एक लैपटॉप दोनों को एक ही प्रीव्यू चाहिए हो, तो उनके आगे VPS पर सेल्फ़-होस्टेड WireGuard VPN लगा दें: dev सर्वर एक प्राइवेट इंटरफ़ेस पर बाइंड होते हैं, और ufw पब्लिक इंटरफ़ेस से आने वाली हर चीज़ को पहले की तरह नकारता रहता है। फ़ायरवॉल तभी काम आता है जब आप उसमें छेद करना बंद कर दें।
Claude Code इकलौता विकल्प नहीं है: VPS पर कोडिंग AI एजेंट चलाना Aider और Goose को भी तौलता है।
FAQ
क्या SSH कनेक्शन टूटने के बाद भी Claude Code चलता रहता है?
सिर्फ़ तब, जब आपने उसे tmux के भीतर शुरू किया हो। SSH शेल से सीधे चलाई गई प्रोसेस उस शेल की child होती है और लिंक टूटते ही pty के साथ मर जाती है। tmux के भीतर शेल उस अलग चल रहे tmux सर्वर का होता है, इसलिए एजेंट अधूरा काम जारी रखता है और tmux attach आपको उसी स्क्रॉलबैक में वापस पहुँचा देता है। हर लॉगिन के बाद पहली कमांड tmux new -A -s <project> बना लें, तो यह समस्या ख़त्म हो जाती है।
क्या मुझे CLI को sudo npm install -g से इंस्टॉल करना चाहिए?
नहीं। root के मालिकाना हक़ वाला ग्लोबल prefix आगे की इंस्टॉल में EACCES एरर थमाता है और npm कैश में root की फ़ाइलें छोड़ता है। npm का prefix ~/.npm-global पर सेट करें (या nvm जैसा वर्ज़न मैनेजर लें), बिना विशेषाधिकार वाले agent यूज़र के तौर पर इंस्टॉल करें, और ~/.npm-global/bin को ~/.bashrc से — interactive guard के ऊपर — PATH में export करें। अगर आप एक बार sudo npm चला चुके हैं, तो sudo chown -R $(id -u):$(id -g) ~/.npm से कैश ठीक करें।
क्या एजेंट चलाने वाली मशीन पर ssh -A एजेंट फ़ॉरवर्डिंग सुरक्षित है?
यह काम की ज़रूरत से कहीं ज़्यादा दे देती है। फ़ॉरवर्डिंग आपके लोकल SSH एजेंट का सॉकेट उस यूज़र के तौर पर चल रही हर प्रोसेस के सामने खोल देती है, इसलिए जब तक आप जुड़े हैं, मशीन पर मौजूद कुछ भी आपकी कुंजी से किसी भी पहुँच में आने वाले होस्ट के लिए साइन करवा सकता है। सर्वर पर एक ed25519 कुंजी बनाएँ और उसे प्रति-रिपॉज़िटरी deploy key के तौर पर दर्ज करें — write एक्सेस सिर्फ़ तब, जब एजेंट को सचमुच push करना हो।
मेरी बिल्ड सिर्फ़ Killed क्यों छापती है?
बिना स्टैक ट्रेस का एक अकेला शब्द कर्नेल का OOM killer है। sudo dmesg -T | grep -i -E 'out of memory|killed process' से पुष्टि करें; Node की ओर से इसकी जगह JavaScript heap out of memory दिख सकता है। उपाय क्रम से आज़माएँ: एक swapfile जोड़ें, टेस्ट और कंपाइलर का पैरेललिज़्म घटाएँ, NODE_OPTIONS=--max-old-space-size=... बढ़ाएँ, फिर VPS का साइज़ बढ़ाएँ। ध्यान रहे, OOM killer बिल्ड की जगह tmux सर्वर को भी चुन सकता है और आपका पूरा सेशन साथ ले जा सकता है।
tmux या systemd सर्विस?
tmux उन इंटरैक्टिव सेशनों के लिए ठीक है जिनसे आप जुड़ते हैं, जिन्हें देखते हैं और जिनमें टाइप करते हैं — एक एजेंट सेशन ठीक यही है। जो काम तय समय पर, बिना किसी की निगरानी के चलता है, उसकी जगह systemd यूनिट और टाइमर में है, जहाँ लॉगिंग, restart पॉलिसी और बूट के बाद बचे रहना मुफ़्त में मिलता है। अगर आप cron-जैसे जॉब के लिए tmux की ओर हाथ बढ़ा रहे हैं, तो वह जॉब सर्विस बनना चाहता है।