සම්පුර්ණයෙන්ම ටර්මිනලයෙන් ක්‍රියාවලියක් වෙන් කරන්නේ කෙසේද?


317

මම උබුන්ටු හි ටිල්ඩා (ඩ්‍රොප් ඩවුන් ටර්මිනලය) මගේ "විධාන කේන්ද්‍රය" ලෙස භාවිතා කරමි - අනෙක් අය GNOME Do, Quicksilver හෝ Launchy භාවිතා කරන ආකාරය.

කෙසේ වෙතත්, මම දියත් කර ඇති පර්යන්තයෙන් ක්‍රියාවලියක් (උදා: ෆයර්ෆොක්ස්) සම්පූර්ණයෙන්ම වෙන් කරන්නේ කෙසේද යන්න සමඟ මම පොරබදමි - එනම් එවැනි (නොවන) ළමා ක්‍රියාවලියක් වළක්වා ගන්න

  • ආරම්භක පර්යන්තය වසා දැමීමේදී අවසන් වේ
  • STDOUT / STDERR හරහා ආරම්භක පර්යන්තය "දූෂණය කරයි"

උදාහරණයක් ලෙස, "නිසි" පර්යන්ත කවුළුවක Vim ආරම්භ කිරීම සඳහා, මම පහත දැක්වෙන ආකාරයේ සරල පිටපතක් උත්සාහ කර ඇත්තෙමි.

exec gnome-terminal -e "vim $@" &> /dev/null &

කෙසේ වෙතත්, එය තවමත් දූෂණයට හේතු වේ (එසේම, ගොනු නාමයක් සම්මත කිරීම වැඩ කරන බවක් නොපෙනේ).


1
එය ද හොඳ ප්‍රශ්නයකි. මම හිතන්නේ බාෂ් ක්‍රමලේඛන භාෂාවක් ලෙස සැලකීම සාධාරණයි - ඇත්ත වශයෙන්ම මෙම ප්‍රශ්නයේ විෂය පථය

මෙය මෙම ප්‍රශ්නයේ අනුපිටපතකි stackoverflow.com/questions/285015/…
Dana the Sane


ඔබේ භාවිත නඩුව සම්පූර්ණ වෙන්වීමක් විස්තර නොකරයි.
ජිග්ගුන්ජර්

Answers:


363

සියල්ලට කළින්; ඔබ ක්‍රියාවලියක් ආරම්භ කළ පසු, ඔබට එය නැවත නැවැත්වීමෙන් (පහර Ctrl- Z) පසුව bgපසුබිමෙහි නැවත ආරම්භ කිරීමට ඉඩ දෙන්න. එය දැන් "රැකියාවක්" වන අතර, එහි stdout/ stderr/ stdinතවමත් ඔබගේ පර්යන්තයට සම්බන්ධ වේ.

එහි අවසානයට "&" එකතු කිරීමෙන් ඔබට පසුබිමක් ඇති ක්‍රියාවලියක් වහාම ආරම්භ කළ හැකිය:

firefox &

නිශ්ශබ්ද වූ පසුබිමක එය ක්‍රියාත්මක කිරීමට, මෙය භාවිතා කරන්න:

firefox </dev/null &>/dev/null &

අමතර තොරතුරු කිහිපයක්:

nohupඔබේ යෙදුම ක්‍රියාත්මක කිරීම සඳහා ඔබට භාවිතා කළ හැකි වැඩසටහනක් වන අතර ඒ වෙනුවට එහි stdout / stderr ගොනුවකට යැවිය හැකි අතර මව් පිටපත වසා දැමීමෙන් දරුවාට දැනෙන්නේ නැත. කෙසේ වෙතත්, ඔබ යෙදුම ආරම්භ කිරීමට පෙර එය භාවිතා කිරීමට දුරදක්නා නුවණ තිබිය යුතුය. nohupක්‍රියා කරන ආකාරය නිසා , ඔබට එය ක්‍රියාත්මක වන ක්‍රියාවලියකට යෙදවිය නොහැක.

disownයනු ෂෙල්ගේ රැකියා ලැයිස්තුවෙන් ෂෙල් රැකියාවක් ඉවත් කරන බාෂ් බිල්ඩින් ය. කුමක්ද මේ මූලික වශයෙන් අදහස් වන්නේ ඔබ භාවිතා කළ හැකි, නොවේ fg, bgවඩා වැදගත් තවදුරටත් එය මත, නමුත්, එය එල්ලා නැහැ යැවිය යුතු හෝ ඔබ ඔබේ ෂෙල් වසා දැමූ විට SIGHUPඑම දරුවා වෙත තවදුරටත්. මෙන් නොව nohup, ක්‍රියාවලිය දියත් කර පසුබිම් කිරීමෙන් පසුවdisown භාවිතා වේ.

ඔබට කළ නොහැකි දෙය නම් ක්‍රියාවලියක් දියත් කිරීමෙන් පසු එහි stdout / stderr / stdin වෙනස් කිරීමයි. අවම වශයෙන් කවචයෙන් නොවේ. ඔබ ඔබේ ක්‍රියාවලිය දියත් කර එහි stdout ඔබේ පර්යන්තය බව පැවසුවහොත් (ඔබ පෙරනිමියෙන් කරන්නේ එයයි), එවිට එම ක්‍රියාවලිය ඔබේ පර්යන්තයට ප්‍රතිදානය කිරීමට වින්‍යාස කර ඇත. ක්‍රියාවලි වල FD සැකසුම සමඟ ඔබේ කවචයට ව්‍යාපාරයක් නොමැත, එය හුදෙක් ක්‍රියාවලියම කළමනාකරණය කරන දෙයකි. ක්‍රියාවලියටම එහි stdout / stderr / stdin වසා දැමිය යුතුද නැද්ද යන්න තීරණය කළ හැකිය, නමුත් එසේ කිරීමට බල කිරීම සඳහා ඔබේ කවචය භාවිතා කළ නොහැක.

පසුබිම් ක්‍රියාවලියක ප්‍රතිදානය කළමනාකරණය කිරීම සඳහා, ඔබට ස්ක්‍රිප්ට් වලින් විකල්ප රාශියක් ඇත, "නොහූප්" බොහෝ විට මතකයට එන්නේ. නමුත් අන්තර්ක්‍රියාකාරී ක්‍රියාවලීන් සඳහා ඔබ නිහ but කිරීමට අමතක කළත් ( firefox < /dev/null &>/dev/null &) ඔබට බොහෝ දේ කළ නොහැක.

මම ඔබට GNU ලබා ගැනීමට නිර්දේශ කරමි screen. ක්‍රියාවලියේ ප්‍රතිදානය කරදරයක් වූ විට තිරය සමඟ ඔබේ ධාවන කවචය වසා දමා නව එකක් විවෘත කළ හැකිය ( ^Ac).


ඔහ්, සහ මාර්ගය වන විට, ඔබ එය භාවිතා කරන තැන " $@" භාවිතා නොකරන්න.

$@මාර්ගයෙන්, $1, $2, $3..., ඔබගේ විධානය හැරී කරන,:

gnome-terminal -e "vim $1" "$2" "$3" ...

එය ඔබට අවශ්‍ය දේ නොවිය හැකි නිසා -e එක් තර්කයක් පමණක් ගනී . $1ඔබගේ ස්ක්‍රිප්ටයට හැසිරවිය හැක්කේ එක් තර්කයක් පමණක් බව පෙන්වීමට භාවිතා කරන්න .

ඔබ ලබා දුන් තත්වය තුළ (සමඟ gnome-terminal -e) බහුවිධ තර්ක නිසියාකාරව ක්‍රියාත්මක කිරීම ඇත්තෙන්ම දුෂ්කර ය, මන්ද -eඑය එක් තර්කයක් පමණක් ගන්නා අතර එය ෂෙල් විධාන නූලකි. ඔබට ඔබේ තර්ක එකකට කේතනය කිරීමට සිදුවේ. හොඳම හා වඩාත්ම ශක්තිමත්, නමුත් තරමක් හුරුබුහුටි, මාර්ගය එසේ ය:

gnome-terminal -e "vim $(printf "%q " "$@")"

මේ සඳහා බොහොම ස්තූතියි! කනගාටුවට කරුණක් නම් මට පිළිගත හැක්කේ එක් පිළිතුරක් පමණි. මම "nohup $ @ &> / dev / null &" සහ "alias wvim = 'launch.sh gnome-terminal -x vim'"

24
මොනතරම් මන fant කල්පිත සවිස්තරාත්මක හා තොරතුරු සහිත පිළිතුරක්ද? +1
ටීකින්

1
@ හායි-ඒන්ජල් ඔබ අන්තර්ක්‍රියාකාරී බැෂ් කවචයක් වසා දැමූ විට, HUP සියළුම ක්‍රියාකාරී රැකියා වලට පහර දෙන්න. ඔබ ^ Z සහ bg ක්‍රියාවලියක් කළ විට එය තවමත් රැකියාවකි, එය පසුබිමක් වේ. එය රැකියාවක් ලෙස ඉවත් කිරීමට, භාවිතා කරන්න disown, එවිට ඔබ කවචය වසා දැමීමෙන් පසු ක්‍රියාවලිය දිගටම පවතිනු ඇත.
lhunath

3
දැනටමත් වෙනම නූල් වල ගැටළුව විසඳීම $*වෙනුවට භාවිතා නොකරන්නේද $@?
sjas

2
ඔබට කළ නොහැකි දෙය නම් ක්‍රියාවලියක් දියත් කිරීමෙන් පසු එහි stdout / stderr / stdin වෙනස් කිරීමයි. - හරියටම සත්‍ය නොවේ. reptyrමේ සඳහා භාවිතා කරන්න .
ස්ටෙෆාන් සීඩෙල්

203
nohup cmd &

nohup ක්‍රියාවලිය මුළුමනින්ම වෙන් කරයි (එය නිරූපණය කරයි)


5
සාරාංශය වටිනා වුවත්, සම්පූර්ණත්වය වඩා වටී. Nohup යනු GNU coreutil වුවද, මෙහි පමණක් සුදුසු පිළිතුරක් (හෝ එකක් නොමැති වීම ගැන සටහනක්) සුදුසු වේ. හොඳ පිළිතුර කෙසේ වෙතත්.
සීමිත පව් කමාව

24
nohupසං .ාව නොසලකා SIGHUPහරින්න. එය සාමාන්‍යයෙන් ක්‍රියාවලිය ක්‍රියාත්මක කරයි. භූතකරණය නොමැත.
nemo

1
emnemo යන්නෙන් අදහස් කරන්නේ ක්‍රියාවලිය වෙන් නොකෙරේ, නමුත් initකවචය පිටව ගියහොත් එය වෙන් වී යනු ඇත (සහ දරුවෙකු ) ... හරිද?
නොල්ඩෝරින්

Old නොල්ඩෝරින් ඔව්. SIGHUP නොසලකා හැරීම, කවචය අවසන් වූ විට යවනු ලබන අතර, එය ළමා ක්‍රියාවලිය ක්‍රියාත්මක වන අතර init වෙත නැවත ගෙන යනු ඇත.
nemo

emnemo nohup ද / පිටත ප්‍රමිතිය නිහ ces කරයි. සම්පූර්ණයෙන්ම වෙන් කිරීම සඳහා ප්‍රතික්ෂේප කිරීම සමඟ පසු විපරම් කරන්න.
ජිග්ගුන්ජර්

62

ඔබ භාවිතා කරන්නේ නම් bash, උත්සාහ කරන්න ; බලන්න bash (1) .disown [jobspec]

ඔබට උත්සාහ කළ හැකි තවත් ප්‍රවේශයක් නම් at now. ඔබ සුපිරි පරිශීලකයෙකු නොවේ නම්, භාවිතා කිරීමට ඔබගේ අවසරය atසීමා කළ හැකිය.


"ප්‍රතික්ෂේප කිරීම" අභ්‍යන්තර බාෂ් විධානයක් ලෙස නොපෙනේ (මගේ යන්ත්‍රයේ නොමැත, මම බාෂ් භාවිතා කරමි). බෙන් යෝජනා කළ පරිදි “නොහූප්” මෙය කිරීමට වඩා හොඳ (හා සම්මත) ක්‍රමයක් විය හැකිය.

1
"at" භාවිතා කිරීමට කිසි විටෙකත් නොසිතුවේය, අදහසට ස්තූතියි!
කේඩ්‍රියන්

1
atමරණ දණ්ඩනය වෙනත් කෙනෙකුට පැවරීමට, මම එයට කැමතියි! +1
නින්සුඕ

1
යොමු ලක්ෂ්‍යයක් ලෙස, මෙය ද ක්‍රියාත්මක zshවේ.
කෝඩරර්

1
එසේම, disownසමග අපේක්ෂිත බලපෑමක් ඇති බවක් පෙනෙන්ට නැත gnome-terminal- disownවිට පර්යන්තය පිටවීම් දොරටු සංස් ක්රියාවලිය තවමත් මිය ගොස් ඇත. ඇයි / කෙසේද යන්න දැන ගැනීමට මම කැමතියි.
කයිල් ස්ට්‍රෑන්ඩ්

41

මෙම පිළිතුරු කියවන විට, නිකුත් කිරීම nohup <command> &ප්‍රමාණවත් වනු ඇතැයි යන මූලික හැඟීම මා තුළ විය . Gnome-පර්යන්තය තුළ zsh ධාවනය, මම ඒ සොයා nohup <command> &පිටවීමේ මත ළමා ක්රියාවලිය ඝාතනය මගේ ෂෙල් නතර කිරීමට සමත් වූයේ නැත. nohupප්‍රයෝජනවත් වුවද , විශේෂයෙන් අන්තර්ක්‍රියාකාරී නොවන ෂෙල් වෙඩි සමඟ වුවද , එය මෙම හැසිරීම සහතික කරනුයේ ළමා ක්‍රියාවලිය සං hand ාව සඳහා එහි හසුරුව නැවත සකසන්නේ නැත්නම් පමණි SIGHUP.

මගේ නඩුවේදී, nohupයෙදුමට ළඟා වීම වළක්වා ගැනීමේ සං sign ා වලක්වා තිබිය යුතුය, නමුත් ළමා යෙදුම (මෙම නඩුවේ VMWare Player) එහි SIGHUPහසුරුව නැවත සකසමින් සිටියේය. එහි ප්‍රති result ලයක් ලෙස ටර්මිනල් ඉමුලේටරය පිටවන විට, එය තවමත් ඔබගේ උපසිරැසි විනාශ කළ හැකිය. මෙය විසඳිය හැක්කේ මගේ දැනුමට අනුව, ක්‍රියාවලිය ෂෙල් එකේ රැකියා වගුවෙන් ඉවත් කර ඇති බව සහතික කිරීමෙනි. nohupසමහර විට සිදු වන පරිදි, ෂෙල් බිල්ඩින් සමඟ අභිබවා ගියහොත් , මෙය ප්‍රමාණවත් විය හැක, කෙසේ වෙතත්, එය එසේ නොවේ නම් ...


disownතිබෙන shell builtin වේ bash, zshහා ksh93,

<command> &
disown

හෝ

<command> &; disown

ඔබ එක් ලයිනර් වලට කැමති නම්. උප වගුව රැකියා වගුවෙන් ඉවත් කිරීමේ සාමාන්‍යයෙන් යෝග්‍ය බලපෑම මෙයයි. ළමා ක්‍රියාවලිය අහම්බෙන් සං aling ා නොකර ටර්මිනල් ඉමුලේටරයෙන් පිටවීමට මෙය ඔබට ඉඩ සලසයි. SIGHUPහසුරුවන්නාගේ පෙනුම කුමක් වුවත් , මෙය ඔබේ දරුවාගේ ක්‍රියාවලිය විනාශ නොකළ යුතුය.

විසන්ධි කිරීමෙන් පසුව, ක්‍රියාවලිය තවමත් ඔබගේ ටර්මිනල් ඉමුලේටරයේ දරුවෙකි ( pstreeඔබට මෙය ක්‍රියාවෙන් නැරඹීමට අවශ්‍ය නම් සෙල්ලම් කරන්න ), නමුත් ටර්මිනල් ඉමුලේටරය පිටවීමෙන් පසුව, එය ආරම්භක ක්‍රියාවලියට අනුයුක්ත කර ඇති බව ඔබ දැකගත යුතුය. වෙනත් වචන වලින් කිවහොත්, සෑම දෙයක්ම එය විය යුතු ආකාරයටම වන අතර ඔබට එය අවශ්‍ය යැයි සිතිය හැකිය.

ඔබේ කවචය සහාය නොදක්වන්නේ නම් කුමක් කළ යුතුද disown? එසේ කරන දෙයකට මාරුවීමට මම තරයේ අවවාද කරමි, නමුත් එම විකල්පය නොමැති විට ඔබට තේරීම් කිහිපයක් තිබේ.

  1. screenසහ tmuxමෙම ගැටළුව විසඳිය හැකි නමුත් ඒවා වඩා බර බර විසඳුම් වන අතර එවැනි සරල කාර්යයක් සඳහා ඒවා ක්‍රියාත්මක කිරීමට මම අකමැතියි. සාමාන්‍යයෙන් දුරස්ථ යන්ත්‍රයක tty එකක් පවත්වා ගැනීමට ඔබට අවශ්‍ය අවස්ථාවන් සඳහා ඒවා වඩාත් සුදුසු වේ.
  2. බොහෝ පරිශීලකයින් සඳහා, ඔබේ කවචය zsh වැනි හැකියාවක් සඳහා සහය දක්වයිදැයි බැලීම යෝග්‍ය වේ setopt nohup. SIGHUPකවචය පිටවන විට රැකියා වගුවේ ඇති රැකියා වෙත නොයැවිය යුතු බව සඳහන් කිරීමට මෙය භාවිතා කළ හැකිය . ඔබට මෙය කවචයෙන් පිටවීමට පෙර යෙදිය හැකිය, නැතහොත් ~/.zshrcඔබට එය සැමවිටම අවශ්‍ය නම් එය ෂෙල් වින්‍යාසයට එක් කරන්න .
  3. රැකියා වගුව සංස්කරණය කිරීමට ක්‍රමයක් සොයන්න. මම මේ කරන්න ක්රමයක් සොයා ගැනීමට නො හැකි tcshහෝ csh, තරමක් බාධා වන.
  4. දෙබලක තැබීමට කුඩා සී වැඩසටහනක් ලියන්න exec(). මෙය ඉතා දුර්වල විසඳුමකි, නමුත් ප්‍රභවය විය යුත්තේ පේළි දුසිම් දෙකකින් පමණි. එවිට ඔබට C වැඩසටහනට විධාන රේඛා විධාන ලෙස විධාන යැවිය හැකි අතර එමඟින් රැකියා වගුවේ ක්‍රියාවලියට ඇතුළත් වීම වළක්වා ගන්න.

31
  1. nohup $COMMAND &
  2. $COMMAND & disown
  3. setsid command

මම අංක 2 ඉතා දීර් time කාලයක් තිස්සේ භාවිතා කර ඇත, නමුත් අංක 3 හරියටම ක්‍රියාත්මක වේ. එසේම, disownසතුව nohupධජ -hසමග සියළුම ක්රියාවලියන් වෙනුවෙන් කැප කළ හැකි, -aසහ සියලු ක්රියාවලීන් වෙනුවෙන් කැප කළ හැකි -ar.

නිශ්ශබ්දතාවය ඉටු කරනු ලබන්නේ $COMMAND &>/dev/null.

මෙය උපකාරී වේ යැයි සිතමු!


කෙටි හා පැණිරස; මෙම ඉතා ප්‍රයෝජනවත් සාරාංශයට ස්තූතියි!
ජොනතන් එච්

මට තවමත් මෙම තනතුර සඳහා දැනුම් දීම් ලැබෙනු ඇතැයි විශ්වාස කළ නොහැක ...
මින්ටි ෆ්‍රෙෂ්

9

මම හිතන්නේ තිරය ඔබේ ගැටලුව විසඳයි


9

tcsh වලින් (සහ සමහර විට වෙනත් ෂෙල් වෙඩි වලද), ඔබට ක්‍රියාවලිය වෙන් කිරීමට වරහන් භාවිතා කළ හැකිය.

මෙය සසඳා බලන්න:

> jobs # shows nothing
> firefox &
> jobs
[1]  + Running                       firefox

මේ සඳහා:

> jobs # shows nothing
> (firefox &)
> jobs # still shows nothing
>

මෙය රැකියා ලැයිස්තුවෙන් ෆයර්ෆොක්ස් ඉවත් කරයි, නමුත් එය තවමත් පර්යන්තයට බැඳී ඇත; ඔබ 'ssh' හරහා මෙම නෝඩයට පිවිසී ඇත්නම්, ඉවත් වීමට උත්සාහ කිරීම තවමත් ssh ක්‍රියාවලිය එල්ලනු ඇත.


9

බාෂ් සඳහා වඩාත් සරල හා එකම නිවැරදි පිළිතුර:

command & disown

ඔබට ක්‍රියාවලිය පර්යන්තයෙන් වෙන් කිරීමට අවශ්‍ය නැත, නමුත් කවචයෙන්.


7

උදා සඳහා උප කවචය හරහා tty shell run විධානය විසුරුවා හැරීම

(විධානය)&

පිටවීමේදී භාවිතා කළ පර්යන්තය වසා ඇති නමුත් ක්‍රියාවලිය තවමත් ජීවමානයි.

චෙක් පත -

(sleep 100) & exit

වෙනත් පර්යන්තය විවෘත කරන්න

ps aux | grep sleep

ක්‍රියාවලිය තවමත් ජීවමානයි.


මට අවශ්‍ය වූයේ මෙයයි. උත්කෘෂ්ට පෙළ සඳහා කොන්සෝල කෙටිමඟක් එක් කිරීමට මම උත්සාහ කළ අතර එය මනාව ක්‍රියාත්මක වේ, මෙන්න මම අවසන් කළේ: ("/ opt / Sublime Text 2 / sublime_text" $ @) &
Ron E

5

රැකියාවක් පසුබිම් කිරීම සහ පෙර සැකසීම සෑම යුනික්ස් සිස්-පරිපාලකයෙකු දැනගත යුතු පළමු දෙය විය හැකිය.

මෙන්න එය bash සමඟ සිදු කරන ආකාරය:

./script.sh
# suspend process
{ctrl-Z}
# background process
bg
# list all backgrounded jobs
jobs
# bring it back to foreground
fg

4

ඔබට nohup විධානය භාවිතා කර ඔබේ විධානය ක්‍රියාත්මක කළ හැකිය, මෙය ඔබගේ ක්‍රියාවලිය වෙන් කර දී ඇති ගොනුවකට ප්‍රතිදානයන් හරවා යවයි ... නමුත් එය ඔබට අවශ්‍ය දේම බව මට විශ්වාස නැත ..


ක්‍රියාත්මක කිරීමට පෙර මම නොහප් උත්සාහ කර ඇති බවට දිවුරුම් දිය හැකිය - නමුත් පෙනෙන ආකාරයට එය නිසි ලෙස ක්‍රියාත්මක නොවේ: nohup gnome-terminal -e "vim $ @" &> / dev / null &

3

මෙය ඔබගේ bashrc / zshrc හි එක් කරන්න:

detach() {
  "$@" 1>/dev/null 2>/dev/null &; disown
}

එවිට ඔබට මේ ආකාරයට ප්‍රතික්ෂේප කළ විධාන ක්‍රියාත්මක කළ හැකිය:

detach gedit ~/.zshrc

2

ඩීමන් උත්සාහ කරන්න - ඔබේ මිත්‍රශීලී පැකේජ කළමණාකරුගෙන් ලබා ගත හැකි අතර පර්යන්තයෙන් බැහැර වන සෑම ක්‍රමයක් ගැනම හොඳින් සැලකිලිමත් වන්න.


1

මගේ .bashrc හි, මෙම කාර්යයන් හරියටම එම අරමුණු සඳහා ඇත:

function run_disowned() {
    "$@" & disown
}

function dos() {
    # run_disowned and silenced

    run_disowned "$@" 1>/dev/null 2>/dev/null
}

dosටර්මිනලයෙන් වෙන් කොට ක්‍රියාත්මක කිරීමට විධානයක් උපසර්ග කරන්න .

ශ්‍රිතය ලියා ඇත්තේ bashසහ සමඟ වැඩ කිරීමට ය zsh.


1
ශරීරය සමඟ එක් ශ්‍රිතයක් පමණක් භාවිතා කිරීමට ප්‍රමාණවත් වන විට, මෙම පිළිතුර එක් ශ්‍රිතයක් තවත් ශ්‍රිතයක් තුළට ඔතා භාවිතා කරන්නේ මන්දැයි මම තරමක් ව්‍යාකූල වී සිටිමි ( "$@" & disown) &> /dev/null. එය භාවිතා කිරීමට එතරම් තේරුමක් නැති 1>අතර 2>, ඔබ භාවිතා කරන නිසා disown, එයින් අදහස් වන්නේ ඔබ බාෂ් භාවිතා කරන බවයි, සහ බාෂ් වලදී ඔබට &>stdout සහ stderr යන දෙකම හරවා යැවීමට පහසුවෙන් කළ හැකිය
Sergiy Kolodyazhnyy

මට එය ශ්‍රිත දෙකක් ලෙස ඇත (1) මේ ආකාරයෙන් කියවීම පහසු යැයි මම සිතමි, සහ (2) run_disownedමගේ තිත් ලිපිගොනු වල වෙනත් ස්ථානවල ක්‍රියාකාරිත්වය මට අවශ්‍යය. &>ඇත්ත වශයෙන්ම ඔබ කාරණය ගැන හරි .
mic_e

0

මැක් ඕඑස් එක්ස් හි මා සොයාගෙන ඇති පරිදි ළමා ක්‍රියාවලිය පර්යන්තය සමඟ ඉරා නොයන බවට වග බලා ගැනීම සඳහා මට නොහප් සහ ප්‍රතික්ෂේප කිරීම යන දෙකම භාවිතා කළ යුතුය.


0

මෙය සිදු කිරීම සඳහා මම පහත පිටපත භාවිතා කරමි. එය ටර්මිනලයට මුද්‍රණය කිරීමේ ක්‍රියාවලිය නවත්වයි, nohupවිධානය අවසන් වුවහොත් ආපසු පැමිණීමේ තත්වය සමඟ පිටවෙයි TIMEOUT.

#!/bin/bash

TIMEOUT=0.1

CMD=( "$@" )
#Could have some shortcuts here, e.g. replace "somefile.c" with "gedit somefile.c"

#use nohup to run the command, suppressing its output and allowing the terminal to be closed
#also send nohup's output to /dev/null, supressing nohup.out
#run nohup in the background so this script doesn't block
#print the command for debugging and to see bash variable expansion
printf "%q " "${CMD[@]}"
echo
nohup "${CMD[@]}" >/dev/null 2>&1 &
NOHUP_PID=$!

#kill this script after a short time, exiting with success status - command is still running
#this is needed as there is no timeout argument for `wait` below
MY_PID=$$
trap "exit 0" SIGINT SIGTERM
sleep $TIMEOUT && kill $MY_PID 2>/dev/null & #ignore "No such process" error if this exits normally

#if the command finishes before the above timeout, everything may be just fine or there could have been an error
wait $NOHUP_PID
NOHUP_STATUS=$?
#print an error if there was any. most commonly, there was a typo in the command
[ $NOHUP_STATUS != 0 ] && echo "Error: $CMD"
#return the exit status of nohup, whatever it was
exit $NOHUP_STATUS

භාවිත උදාහරණය:

>>> run false
false
Error: false
>>> echo $?
1
>>> run true
true
>>> run sleep 10
sleep 10
>>>

0

sudo apt install ucommon-utils

pdetach command

ඔන්න ඔයා යන්න :)


-1

බොහෝ පිළිතුරු යෝජනා කර ඇත්තේ nohup භාවිතා කිරීමට . මම යෝජනා කරන්නේ pm2 භාවිතා කිරීමටයි . යෙදුම සජීවීව තබා ගැනීම, යෙදුම සඳහා ලොග් ලිපිගොනු නඩත්තු කිරීම සහ තවත් බොහෝ විශේෂාංග වැනි pmh over nohup භාවිතා කිරීමෙන් බොහෝ වාසි ඇත. වැඩි විස්තර සඳහා මෙය පරීක්ෂා කරන්න .

PM2 ස්ථාපනය කිරීම සඳහා ඔබ npm බාගත කළ යුතුය. ඩේබියන් පදනම් කරගත් පද්ධතිය සඳහා

sudo apt-get install npm

සහ රෙඩ්හැට් සඳහා

sudo yum install npm

නැතහොත් ඔබට මෙම උපදෙස් අනුගමනය කළ හැකිය . ස්ථාපනයෙන් පසු npm භාවිතය එය ස්ථාපනය කිරීමට pm2

npm install pm2@latest -g

එය අවසන් වූ පසු ඔබට ඔබගේ යෙදුම ආරම්භ කළ හැකිය

$ pm2 start app.js              # Start, Daemonize and auto-restart application (Node)
$ pm2 start app.py              # Start, Daemonize and auto-restart application (Python)

ක්‍රියාවලි අධීක්ෂණය සඳහා පහත දැක්වෙන විධානයන් භාවිතා කරන්න:

$ pm2 list                      # List all processes started with PM2
$ pm2 monit                     # Display memory and cpu usage of each app
$ pm2 show [app-name]           # Show all informations about application

යෙදුම් නම හෝ ක්‍රියාවලි හැඳුනුම්පත භාවිතයෙන් ක්‍රියාවලි කළමනාකරණය කරන්න හෝ සියලු ක්‍රියාවලි එකට කළමනාකරණය කරන්න:

$ pm2 stop     <app_name|id|'all'|json_conf>
$ pm2 restart  <app_name|id|'all'|json_conf>
$ pm2 delete   <app_name|id|'all'|json_conf>

ලොග් ලිපිගොනු සොයාගත හැකිය

$HOME/.pm2/logs #contain all applications logs

2
යුනික්ස් ක්‍රියාවලි පාලනය කිරීම සඳහා NodeJS යෙදුමක් (නොහප් වැනි කුඩා හා ශක්තිමත් විධානයකට එදිරිව) භාවිතා කිරීම පෙනේ ... සැබවින්ම අධික ලෙස මරණයට පත්වීම සහ අවංකව පැවසීම අමුතුයි. ඔබට නැවත ආරම්භ කිරීමේ ක්‍රියාකාරිත්වය අවශ්‍ය නම් මම මොනිටරය භාවිතා කරමි.
සර්ජියෝ

Er සර්ජියෝ, ක්ෂය කළ යෙදුම භාවිතා කිරීම ඔබේ තේරීමයි.
හක්ස්

මේ වසරේ නිකුත් කිරීම් කිහිපයක් සිදු කර ඇත (දින 4 කට පෙර), එබැවින් මොනිටරය අවලංගු කරන ලද යෙදුමක් යැයි ඔබ සිතන්නේ කෙසේද / ඇයි කියා මට නොපෙනේ. @see mmonit.com/monit/changes
සර්ජියෝ

මම කතා කළේ නෝහප් ගැන.
හැක් කරයි

2
nohupසරල සම්මත POSIX විධානයකි, එබැවින් එකම ප්‍රකාශය: එය ප්‍රතික්ෂේප නොකෙරේ. @see unix.com/man-page/posix/1p/nohup
සර්ජියෝ

-1

ඔබේ ඉලක්කය වන්නේ ටර්මිනල් කවුළුව වටා තබා නොගෙන විධාන රේඛා යෙදුමක් දියත් කිරීමයි, එවිට ඔබට alt-F2 සමඟ පර්යන්තය දියත් කිරීමෙන් පසු යෙදුම ක්‍රියාත්මක කිරීමට උත්සාහ කළ හැකිය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.