ටර්මිනලය ආසන්නයේ නොනැසී පවතින විධානයක් ක්‍රියාත්මක කරන්නේ කෙසේද?


341

සමහර විට මට ක්‍රියාවලියක් ආරම්භ කර එය අමතක කිරීමට අවශ්‍යය. මම එය විධාන රේඛාවෙන් ආරම්භ කළහොත්, මේ ආකාරයට:

redshift

මට පර්යන්තය වසා දැමිය නොහැක, නැතහොත් එය ක්‍රියාවලිය විනාශ කරයි. ක්‍රියාවලිය විනාශ නොකර පර්යන්තය වසා දැමිය හැකි ආකාරයට මට විධානයක් ක්‍රියාත්මක කළ හැකිද?


4
සියලුම ඩිස්ට්‍රෝස් වල පෙරනිමි ස්ථාපනය නොවේ, නමුත් තිරය ඔබේ මිතුරා ය: en.wikipedia.org/wiki/GNU_Screen
Zayne S Halsall

2
එකම ගැටලුවකට මුහුණ දෙන ඕනෑම කෙනෙකුට: මතක තබා ගන්න, ඔබ ටයිප් කළත් yourExecutable &, ප්‍රතිදානයන් තිරය මත දිගින් දිගටම පැමිණියත් Ctrl+Cකිසිවක් නතර නොවන බවක් පෙනෙන්නට තිබුණත් , තිරය ප්‍රතිදානයන් සමඟ අනුචලනය වුවද අන්ධ ලෙස ටයිප් disown;කර ඔබන්න. Enterඔබ ටයිප් කරනවා. ක්‍රියාවලිය අහෝසි වන අතර ක්‍රියාවලිය මිය යාමකින් තොරව ඔබට පර්යන්තය වසා දැමිය හැකිය.
නව

ඔබට එවැනි tmux තිර බහුකාර්ය භාවිතා කළ හැකිය . එය උබුන්ටු යන්ත්‍ර මත apt-get හරහා ලබා ගත හැකිය
හිමාන්ෂු

Answers:


343

පහත 2 න් එකක් වැඩ කළ යුතුය:

$ nohup redshift &

හෝ

$ redshift &
$ disown

මෙය ක්‍රියාත්මක වන ආකාරය පිළිබඳ වැඩි විස්තර සඳහා පහත සඳහන් දෑ බලන්න:


5
දෙවැන්න ( redshift & disown) උබුන්ටු 10.10 හි මා වෙනුවෙන් වැඩ කළේය. ඒ සියල්ල එක පේළියක් මත තැබීමෙන් එය හොඳින් ක්‍රියාත්මක වන බව පෙනේ. මම මෙය නොකළ යුතු බවට කිසියම් හේතුවක් තිබේද?
මැතිව්

4
Att මැතිව් පළමුවැන්නා ද හොඳින් වැඩ කළ යුතුය, එය දෙවැන්න මෙන් පසුබිමක් නොදක්වයි (ඔබට අවශ්‍ය nohup redshift &වන්නේ පසුබිමයි). සාමාන්‍යයෙන් ඔබ ;( redshift &; disown) සමඟ වෙන් කළද, දෙවන පේළිය එක් පේළියක තැබීම හොඳයි
මයිකල් මෝසෙක්

11
Ic මයිකල්: දෙකම ;සහ &විධාන බෙදුම්කරුවන් වන අතර සමාන ප්‍රමුඛතාවයක් ඇත. එකම වෙනස වන්නේ සමමුහුර්ත එදිරිව අසමමුහුර්තව ක්‍රියාත්මක කිරීමයි (පිළිවෙලින්). සාධාරණත්වයට වඩා &;මනාපයෙන් භාවිතා කිරීමේ අවශ්‍යතාවයක් නොමැත &(එය ක්‍රියාත්මක වේ, නමුත් එය ටිකක් අතිරික්තය).
ක්‍රිස් ජොන්සන්

4
හොඳ පිළිතුරක් නම්, දෝශ නිරාකරණ ප්‍රතිදානය සමඟ ටර්මිනලය අයාචිත නොවන පරිදි stdout සහ stderr නැවත හරවා යැවීම හොඳ අදහසක් යැයි කෙනෙකුට එකතු කළ හැකිය
කිම්

13
එසේම, redshift &!රතු මාරුව වහාම ප්‍රතික්ෂේප කරනු ඇත.

148

ඔබගේ වැඩසටහන නම් දැනටමත් ධාවනය ඔබ සමග එය තාවකාලිකව නවත්වන්න පුළුවන් Ctrl-Z, සමග පසුබිම බවට අදින්න bgහා පසුව disownමේ වගේ, එය:

$ sleep 1000
^Z
[1]+  Stopped                 sleep 1000
$ bg
$ disown
$ exit

3
ක්‍රියා විරහිත කිරීමෙන් පසු නැවත ක්‍රියාත්මක වීමේ ක්‍රියාවලිය නැවත කියවන්නේ කෙසේද?
නෙක්ට්වි


1
කිසියම් හේතුවක් නිසා මෙය මට වැඩ කළේ නැත (සෙන්ටෝස්)
ඉයන්

2
@necktwi stdout disownහෝ stderr විසන්ධි නොකරයි. කෙසේ වෙතත් nohup, >/dev/null(සම්මත විසන්ධි කරන්න), 2>/dev/null(සම්මත දෝෂය විසන්ධි කරන්න). එය ( disown) රැකියා පාලනය විසන්ධි කරයි.
ctrl-alt-delor

1
මෙය සොයා ගන්නා වෙනත් ඕනෑම කෙනෙකුට, මෙය මට අවුල් සහගත දේවල් නිසා ප්‍රවේශම් වන්න. Ctrl + z එය හොඳින් නැවැත්වූ නමුත් bg එය නැවත ධාවනය කිරීමට පටන් ගත් අතර දැන් එය Ctrl + Z හෝ Ctrl + C වලට ප්‍රතිචාර නොදක්වයි. දැන් ක්‍රියාත්මක වන විධානයෙන් ආරක්ෂිතව පිටවීමට ක්‍රමයක් නොමැති බව පෙනේ. එයට හේතුව කුමක්දැයි නොදැන, එය පැවසූ දේම කළා, නමුත් කුමන හේතුවක් නිසා හෝ bgඑය නැවත ධාවනය කරවා ගත්තා. කිසිවක් ටයිප් disownකිරීමට තරම් ප්‍රතිදානයක් ඇති බැවින් මට ඊළඟ පියවර ටයිප් කිරීමට නොහැකිය .
ජෝන් මෙලර්

51

හොඳ පිළිතුර දැනටමත් teStevenD විසින් පළ කර ඇත, නමුත් මෙය තව ටිකක් පැහැදිලි කර දෙනු ඇතැයි මම සිතමි.

පර්යන්තය අවසන් වීමෙන් පසු ක්‍රියාවලිය මරණයට පත්වීමට හේතුව ඔබ ආරම්භ කරන ක්‍රියාවලිය පර්යන්තයේ ළමා ක්‍රියාවලියක් වීමයි. ඔබ පර්යන්තය වසා දැමූ පසු, මෙය මෙම ළමා ක්‍රියාවලීන් ද විනාශ කරයි. ඔබට ක්‍රියාවලි ගස දැක ගත හැකිය pstree, උදාහරණයක් ලෙස kate &කොන්සෝල් හි ධාවනය වන විට :

init-+
     ├─konsole─┬─bash─┬─kate───2*[{kate}]
     │         │      └─pstree
     │         └─2*[{konsole}]

මෙම කිරීමට kateඉහලට ඔසවා ක්රියාවලිය konsoleඔබ අවසන් වන විට konsole, භාවිතා nohupමේ වගේ, මෙම විධානය සමඟ:

nohup kate &

වසා දැමීමෙන් පසු konsole, මේ ආකාරයට pstreeපෙනෙනු ඇත:

init-+
     |-kate---2*[{kate}]

සහ kateනොනැසී පවතිනු ඇත. :)

විකල්පයක් වන්නේ screen/ tmux/ භාවිතා කිරීමයි byobu, එමඟින් පර්යන්තයෙන් ස්වාධීනව කවචය ක්‍රියාත්මක වේ.


ප්‍රතික්ෂේප කිරීමේ ක්‍රම සමඟ මට ගැටලු ඇති විය. මෙය දැනට මා වෙනුවෙන් වැඩ කරමින් සිටී. මමත් මේකට කැමතියි මොකද වෙන්නේ කියලා බලන්න, නමුත් මගේ සැසිය අසමත් වීම ගැන කරදර වෙන්න එපා
ඉයන්

32

ඔබට ටර්මිනලය තුළ මෙවැනි ක්‍රියාවලිය ක්‍රියාත්මක කළ හැකිය

setsid process

මෙය නව සැසියකදී වැඩසටහන ක්‍රියාත්මක කරනු ඇත. පැහැදිලි කළ පරිදි http://hanoo.org/index.php?article=run-program-in-new-session-linux


1
නොහප් වලට වඩා සෙට්සිඩ් වල වාසි ලෙස ඔබ දකින්නේ කුමක්ද?
බ ru ස්

2
1) එය ගැන කරදරකාරී පණිවිඩයක් මුද්‍රණය නොකරයි nohup.out. 2) එය ඔබගේ කවචයේ රැකියා ලැයිස්තුවේ නොපවතින බැවින් එහි ප්‍රතිදානය අවුල් නොවේ jobs.
මයිකල්

Lxterminal හි ධාවනය වන, pcmanfm දියත් කිරීම සහ පිටවීම (සෙට්සිඩ් සමඟ පර්යන්තය වසා දැමිය හැකි අතර pcmanfm දිගටම ක්‍රියාත්මක වන අතර) ස්ක්‍රිප්ට් සමඟ වැඩ කළ එකම විසඳුම මෙයයි. ඔයාට බොහෝම ස්තූතියි!
desgua

එය ක්‍රියාත්මක වේ tint2, ස්තූතියි
kokbira

11

සියලු යෝජනා හොඳින් ක්‍රියාත්මක වුවද, මගේ විකල්පය screenඔබේ තිරය මත අතථ්‍ය පර්යන්තයක් සැකසෙන වැඩසටහනක් භාවිතා කිරීම බව මට පෙනී ගියේය.

ඔබට එය ආරම්භ කිරීම ගැන සලකා බැලිය හැකිය . සියලුම ලිනක්ස් සහ යුනික්ස් ව්‍යුත්පන්නයන්හි තිරය ස්ථාපනය කළ හැකිය. + සහ (කුඩා අකුරු) එබීමෙන් දෙවන සැසිය ආරම්භ වේ. මෙය ඔබ පහර විසින් මුල් සැසිය අතර සහ පසුපසට ටොගල් කිරීමට ඉඩ + සහ හෝ පහර විසින් නව සැසිය + හා . ඔබට එක් පර්යන්තයක සැසි දහයක් දක්වා තිබිය හැකිය. මම වැඩ කරන ස්ථානයේ සැසියක් ආරම්භ කර, ගෙදර ගොස්, මගේ වැඩ යන්ත්‍රයට ඇතුළු වී, පසුව ආයාචනා කළෙමි . මෙය ඔබව එම දුරස්ථ සැසියට නැවත සම්බන්ධ කරයි.screen -S session_nameCtrlACCtrlA0CtrlA1screen -d -R session_name


screen -d -m commandදැනටමත් වෙන් කර ඇති තිරය තුළ එය ආරම්භ කරනු ඇත: ~# screen -d -m top ~# screen -ls There is a screen on: 10803..Server-station (Detached) 1 Socket in /root/.screen. ~# screen -x .... සහ ඔබ ඇතුළට
වෛද්‍ය ඇලෙක්සැන්ඩර්

9

මම කැමතියි:

(applicationName &)

උදාහරණයක් වශයෙන්: linux@linux-desktop:~$ (chromium-browser &)

විධානය ටයිප් කිරීමේදී වරහන් භාවිතා කිරීමට වග බලා ගන්න!


1
ටර්මිනලය
වැසීමෙන්

1
වරහන් නොමැතිව මම මගේ පිළිතුරෙහි භාවිතා කර ඇති ක්ෂණික විධානය ඔබ සතුව ඇත, එසේ නම් පර්යන්තය වසා දැමීමෙන් ක්‍රියාවලිය විනාශ වනු ඇත, එසේ නොවුවහොත් එය සිදු නොවේ. එය පැහැදිලි කිරීම සඳහා මම දැනටමත් ඉහත විසඳුම සංස්කරණය කර ඇත්තෙමි.
daGo

මා වෙනුවෙන් වැඩ කරන්න, tnx
noadev

මම කල්පනා කරනවා ඇයි මේකට වැඩි නැගිටීමක් නැත්තේ කියලා. nohupඕනෑම tty ප්‍රතිදානයක් වළක්වන අතර මට ඇත්ත වශයෙන්ම අවශ්‍ය වූයේ ප්‍රතිදානය ගොනුවකට හරවා යැවීමයි. එමඟින් එය මට වඩා හොඳ විසඳුමයි.
redanimalwar

අතිශයින්ම සිත්ගන්නා සුළුය. පිරිසිදු කර අතිරේක විධානයක් භාවිතා නොකරයි. එය සුඩෝ සමඟ පවා හොඳින් ක්‍රීඩා කරයි.
බ්‍රෙට්

8

මේ සියල්ල කිරීමට ෂෙල්-එකම ක්‍රමය වන්නේ විධානය වසා දමා විධානය පසුබිම් කිරීමයි:

command <&- & 

ඔබ කවචයෙන් ඉවත් වූ විට එය ඉවත් නොවේ. Stdout නැවත හරවා යැවීම හොඳ විකල්පයකි.

අවාසිය නම් ඔබට මෙය කළ නොහැකි වීමයි.


මම උබුන්ටු වල උත්සාහ කළා. Killing ාතන පර්යන්තය ද දියත් කළ ක්‍රියාවලිය වසා දැමීය. මෙය එසේ විය හැක්කේ මන්ද යන්න පිළිබඳ කිසියම් අදහසක් තිබේද?
අශෝක් කොයි

8

මට පිටපතක් ඇත:

  • පසුබිමේ අත්තනෝමතික විධානයන් ක්‍රියාත්මක කරන්න

  • පර්යන්ත කවුළුව සමඟ ඔවුන් මරා දැමීම වළක්වන්න

  • ඔවුන්ගේ ප්‍රතිදානය යටපත් කරන්න

  • පිටවීමේ තත්වය හසුරුවයි

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

#!/bin/bash

TIMEOUT=0.1

#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
nohup "${@}" >/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 ${@}"
#return the exit status of nohup, whatever it was
exit $NOHUP_STATUS

උදාහරණ...

>>> run true && echo success || echo fail
success
>>> run false && echo success || echo fail
Error false
fail
>>> run sleep 1000 && echo success || echo fail
success
>>> run notfound && echo success || echo fail
Error notfound
fail

5

ඉවත් වී පර්යන්ත සැසිය වසා දැමීමෙන් පසු ඔබට HUP සං signal ාවක් නොලැබෙන ලෙස ක්‍රියාවලියක් (PID) සැකසිය හැකිය. පහත විධානය භාවිතා කරන්න:

nohup -p PID

4

ඇපොලින්ස්කි ඉදිරිපත් කළ පිළිතුරට තර්කානුකූලව සමාන වන අතර , මම ප්‍රභේදයක් භාවිතා කරමි screen. වැනිලා විධානය මේ වගේ ය

screen bash -c 'long_running_command_here; echo; read -p "ALL DONE:"'

සැසිය විසන්ධි කර Ctrl ACtrl Dසරල නඩුවේදී නැවත සම්බන්ධ කළ හැකිය screen -r. මම මෙය ස්ක්‍රිප්ට් එකකින් ඔතා ඇති අතර එය පහසු ප්‍රවේශයක් සඳහා sessionමගේ PATHසූදානම්ව පවතී:

#!/bin/bash
#
if screen -ls | awk '$1 ~ /^[1-9][0-9]*\.'"$1"'/' >/dev/null
then
    echo "WARNING: session is already running (reattach with 'screen -r $1')" >&2
else
    exec screen -S "$1" bash -c "$@; echo; echo '--------------------'; read -p 'ALL DONE (Enter to exit):'"
    echo "ERROR: 'screen' is not installed on this system" >&2
fi
exit 1

මෙය ක්‍රියාත්මක වන්නේ ඔබට වැඩසටහනක් විසන්ධි කිරීමට අවශ්‍ය බව කල්තියා දැනගත් විට පමණි. දැනටමත් ක්‍රියාත්මක වන වැඩසටහනක් විසන්ධි කිරීමට එය සපයන්නේ නැත .


3

මීට සමාන අනෙකුත් පිළිතුරු එක් "තිර" අතීතයට බලපාන ස්තුති කිරීමට භාවිතා කිරීමට ධාවනය ක්රියාවලිය මාරු කළ හැකි, පෙර පල reptyr පසුව සමීප පර්යන්තය. පියවර මෙම විස්තර කරයි පශ්චාත් . ගත යුතු පියවර:

  1. ක්රියාවලිය අත්හිටුවන්න
  2. පසුබිම තුළ ක්‍රියාවලිය නැවත ආරම්භ කරන්න
  3. ක්‍රියාවලිය ප්‍රතික්ෂේප කරන්න
  4. තිර සැසියක් දියත් කරන්න
  5. ක්‍රියාවලියේ PID සොයා ගන්න
  6. ක්‍රියාවලිය භාර ගැනීමට reptyr භාවිතා කරන්න
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.