Công việc nền trong bash đang tắt khi cửa sổ bắn bị đóng: làm thế nào để tránh điều này?


2

Bạn có thể nhanh chóng chuyển đến câu hỏi bắt đầu đọc từ 'Đã nói rằng'
Sau đây là chi tiết về nhu cầu cụ thể của tôi

Tôi đang sử dụng một phần mềm Ubuntu và đang cố gắng tạo một trình khởi chạy máy tính để bàn để bắt đầu / dừng tomcat. Tôi đang gặp vấn đề được giải thích trong chủ đề này, tôi đã mở ngày hôm qua trên diễn đàn lxde.

Về cơ bản trình khởi chạy máy tính để bàn, chỉ thực thi lệnh
/usr/local/tomcat6/bin/startup.sh
bên trong cửa sổ lxterminal hoạt động, nhưng nếu tôi đóng cửa sổ lxterminal được mở bởi trình khởi chạy và thực thi lệnh .. thì tomcat sẽ bị tắt.

Thay vào đó, tôi muốn đóng cửa sổ đó trong khi tomcat tiếp tục chạy.
Cửa sổ chỉ cần thực hiện lệnh để bắt đầu nó và không có gì khác.

Tìm kiếm bên trong mã whoooole được chạy bởi lệnh trên cuối cùng tôi thấy rằng tội lỗi là mã sau đây:

/opt/jdk1.6.0_22/bin/java  \
-Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ \
-Dsolr.data.dir=/home/foo/solr/data \
-Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ \
-Dsolr.data.dir=/home/foo/solr/data \
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
-Djava.util.logging.config.file=/usr/local/tomcat6/conf/logging.properties \
-Djava.endorsed.dirs="/endorsed" \
-classpath ":/usr/local/tomcat6/bin/bootstrap.jar:/usr/local/tomcat6/bin/commons-logging-api.jar" \
-Dcatalina.base="/usr/local/tomcat6" \
-Dcatalina.home="/usr/local/tomcat6" \
-Djava.io.tmpdir="/usr/local/tomcat6/temp" \
org.apache.catalina.startup.Bootstrap "" start \
>> "/usr/local/tomcat6"/logs/catalina.out 2>&1 &

Trong thực tế nếu tôi chạy lệnh này bên trong một cửa sổ lxterminal mới, hành vi tương tự được chú ý:
A) tomcat bắt đầu: nếu tôi mở một lxterminal mới và gõ:

$ ps aux | grep tomcat
foo     21492  0.4  1.5 934436 47248 pts/2    Sl   11:37   0:03 /opt/jdk1.6.0_22/bin/java -Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ -Dsolr.data.dir=/home/foo/solr/data -Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ -Dsolr.data.dir=/home/foo/solr/data -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/usr/local/tomcat6/conf/logging.properties -Djava.endorsed.dirs=/endorsed -classpath :/usr/local/tomcat6/bin/bootstrap.jar:/usr/local/tomcat6/bin/commons-logging-api.jar -Dcatalina.base=/usr/local/tomcat6 -Dcatalina.home=/usr/local/tomcat6 -Djava.io.tmpdir=/usr/local/tomcat6/temp org.apache.catalina.startup.Bootstrap  start
foo     21666  0.0  0.0   4476   768 pts/4    S+   11:53   0:00 grep --color=auto tomcat

B) nếu tôi đóng cửa sổ lxterminal đầu tiên (cửa sổ mà tôi đã chạy lệnh dài ở trên) thì tomcat cũng tắt. Nếu, từ cửa sổ lxterminal thứ hai, tôi gõ lại

$ ps aux | grep tomcat
foo     21694  0.0  0.0   4476   772 pts/4    S+   11:57   0:00 grep --color=auto tomcat



Phải nói rằng
lệnh looong ở trên chỉ là một công việc nền: nếu tôi mở một lxterminal và chỉ cần gõ

$ top &
[1] 21921

và, trong khi giữ cho cửa sổ này mở, tôi mở một cửa sổ lxterminal thứ hai và gõ

$ ps aux | grep top
foo     21921  0.0  0.0   2452   764 pts/2    T    12:07   0:00 top
foo     21927  0.0  0.0   4476   772 pts/4    S+   12:08   0:00 grep --color=auto top

Tôi có thể thấy 'top' đang chạy, trong khi nếu tôi đóng cửa sổ đầu tiên và sau đó từ loại thứ hai một lần nữa

$ ps aux | grep top
foo     21927  0.0  0.0   4476   772 pts/4    S+   12:08   0:00 grep --color=auto top

lệnh 'top' cũng bị tắt.

Vì vậy, có cách nào để bắt đầu một công việc từ cửa sổ lxterminal và công việc này vẫn chạy ngay cả sau khi đóng cửa sổ lxterminal đã bắn nó?

Để rõ ràng:
Tôi muốn mở một cửa sổ lxterminal thực thi một lệnh (như top &), hãy đóng cửa sổ lxterminal này và vẫn chạy lệnh được thực thi.

Đối với những người đọc chi tiết của tôi trên trang đầu:
điều kỳ lạ là nếu tôi mở một cửa sổ lxterminal, hãy gõ trực tiếp
/usr/local/tomcat6/bin/startup.sh
và sau đó đóng cửa sổ đó .. thì tomcat vẫn chạy. Không phải từ trình khởi chạy máy tính để bàn mà chỉ cần mở một cửa sổ lxterminal và bắn cùng một lệnh và sau đó nó đóng lại!


3
Bạn có thể muốn nohuphoặc screen, tùy thuộc vào quá trình có tương tác hay không và bạn cần quay lại với nó.
David Schwartz

1
Nếu bạn chạy exithoặc nhấn CTRL+Dthay vì chỉ đóng cửa sổ, công việc sẽ tiếp tục chạy (nếu được chạy qua &).
Patrick

Câu trả lời:


2

Một giải pháp đơn giản là sử dụng màn hình Bạn có thể cần cài đặt nó bằng cách

apt-get install screen

Sau đó, bạn có thể sử dụng

screen your_command_here

Bạn có thể sử dụng Ctrl-AD để thoát khỏi màn hình nhưng giữ cho nó chạy ở chế độ nền. Sau đó, bạn có thể sử dụng

screen -r 

để quay lại cửa sổ màn hình đó.



1

Tôi nghĩ rằng (Tomcat-) các quá trình của bạn bị giết khi cửa sổ terminal bị đóng vì vỏ, chạy trong cửa sổ terminal, là cha mẹ quá trình quá trình Tomcat của bạn. Vì vậy, khi cha mẹ bị giết, tất cả các quá trình con cũng bị giết.

Nếu bạn không muốn điều này xảy ra, bạn có thể thử khởi chạy quy trình của mình như thế này:

nohup /usr/local/tomcat6/bin/startup.sh


Con cái của một quá trình không được giết khi cha mẹ chết. Chỉ khi một lớp vỏ tương tác thoát ra, nó sẽ gửi SIGHUP cho tất cả các công việc chạy dưới lớp vỏ đó.
Patrick

@Patrick Cảm ơn lời khuyên của bạn! Vấn đề là tôi cũng đã sử dụng shell tương tác .. xem phần chỉnh sửa của tôi để biết giải pháp.
Luca Borrione

0

GIẢI QUYẾT:

Nhờ câu trả lời của bạn, cuối cùng tôi đã giải quyết được: vấn đề cũng là tôi đã sử dụng shell tương tác để xem câu hỏi khác này của tôi .
Vì vậy, giải pháp là:

A) Đưa vào .profile quá những gì tomcat cần

export PATH=/opt/jdk1.6.0_22/bin:$PATH
export JAVA_HOME=/opt/jdk1.6.0_22
export JRE_HOME=/opt/jdk1.6.0_22
export JAVA_OPTS="$JAVA_OPTS -Dsolr.solr.home=/home/foo/solr/solr_config/current/master/ -Dsolr.data.dir=/home/foo/solr/data"

B) Xóa mọi vỏ tương tác và thêm nohup và thoát:
vì vậy trình khởi chạy trên máy tính để bàn của tôi có

[Desktop Entry]
...
Exec=lxterminal --command "bash '/home/foo/scripts/Tomcat/tomcat-startup.sh'"
...

trong khi tomcat-startup.sh về cơ bản là:

...
nohup bash "/usr/local/tomcat6/bin/startup.sh"
...
exit

Và mọi thứ chỉ hoạt động tốt! :CƯỜI MỞ MIỆNG

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.