# Arthas Async Jobs

[`Async Jobs` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=case-async-jobs)

Asynchronous jobs in arthas. The idea is borrowed from [linux jobs](http://man7.org/linux/man-pages/man1/jobs.1p.html).

## 1. Use & to run the command in the background

For example, execute the trace command in the background:

```bash
trace Test t &
```

By doing this, the current command is put to the background to run, you can continue to execute other commands in the console.

## 2. List background jobs

If you want to list all background jobs, you can execute the `jobs` command and the results are as follows:

```bash
$ jobs
[10]*
       Stopped           watch com.taobao.container.Test test "params[0].{? #this.name == null }" -x 2
       execution count : 19
       start time      : Fri Sep 22 09:59:55 CST 2017
       timeout date    : Sat Sep 23 09:59:55 CST 2017
       session         : 3648e874-5e69-473f-9eed-7f89660b079b (current)
```

You can see that there is currently a background job executing:

- job id is 10, `*` indicates that this job is created by the current session.
- status is `Stopped`
- execution count is the number of executions, which have been executed 19 times since the start.
- timeout date: timeout timestamp, when the time exceeds this timestamp, the job will be automatically timeout and exit.

## 3. Suspend and cancel job

When the job is executing in the foreground, for example, directly executing the command `trace Test t`, or executing the background job command `trace Test t &`, then putting the job back to the foreground via `fg` command, the console cannot continue to execute other command, but can receive and process the following keyboard events:

- ‘ctrl + z’: Suspends the job, the job status will change to `Stopped`, and the job can be restarted by `bg <job-id>` or `fg <job-id>`
- ‘ctrl + c’: Stops the job
- ‘ctrl + d’: According to linux semantics this should lead to exit the terminal, right now Arthas has not implemented this yet, therefore simply ignore this keystroke.

## 4. fg/bg, switch the job from the foreground to the background, and vise verse

- When a job is executed in the background or in suspended status (use `ctrl + z` to suspend job), `fg <job-id>` can transfer the job to the foreground to continue to run.
- When a job is in suspended status (use `ctrl + z` to suspend job), `bg <job-id>` can put the job to the background to continue to run.
- A job created by other session can only be put to the foreground to run by using `fg` in the current session.

## 5. Redirect the output

The job output can be redirect to the specified file by `>` or `>>`, and can be used together with `&`. By doing this, you can achieve running commands asynchronously, for example:

```bash
$ trace Test t >> test.out &
```

At this time, the trace command will be executed in the background, and the result will be output to the `test.out` file under the `working directory` of the application. You can continue to execute other commands. And you can view the command execution result in the file. You can execute the `pwd` command to view the `working directory` of the current application.

```bash
$ cat test.out
```

If no redirect file is specified, the result will be output to the `~/logs/arthas-cache/` directory, for example:

```bash
$ trace Test t >> &
job id : 2
cache location : /Users/admin/logs/arthas-cache/28198/2
```

At this time, the command will be executed asynchronously in the background, and the result will be asynchronously saved in the file (`~/logs/arthas-cache/${PID}/${JobId}`);

- At this time, the execution of the task is not affected by the session disconnection; the default timeout period of the task is 1 day, and the default timeout period can be modified through the global `options` command;
- The result of this command will be output asynchronously to the file; at this time, regardless of whether `save-result` is true or not, the result will not be written asynchronously to `~/logs/arthas-cache/result.log`.

## 6. Stop job

If you want to stop background job, just `kill <job-id>`.

## 7. Others

- Support up to 8 commands at the same time to redirect the output to the log files.
- Do not open too many background jobs at the same time to avoid negative performance effect to the target JVM.
- If you do not want to stop the Arthas service and continue to perform background tasks, you can exit the Arthas console by executing `quit` command (`stop` command will stop the Arthas service)
