Solaris File Event Notification

Solaris File Event Notification

Rants about the Solaris OS
Menu
Skip to content
Home › Uncategorized › Solaris File Event Notification
Solaris File Event Notification
Posted on July 24, 2013 by petersblogwp — 33 Comments

Suppose you want your Solaris shell script to take some kind of action when a new file arrives in a certain directory. Traditionally this has been done by periodically polling the directory. Not very elegant and what is worse: it uses unnecessary resources.

Linux has the inotify kernel subsystem and on many distros you’ll also find the inotify-tools so that you can use this from the command line and thus in a script. You would typically use the inotifywait command in scripts to cause a blocking wait for some file event to happen.

So what about Solaris ?

The equivalent of Linux’s inotify in Solaris is called File Events Notifications but the caveat is that although it was created in 2007 it didn’t make it into Solaris until version 11. So you’ll need Solaris v11.0 or Solaris v11.1 or later.

In Solaris 11.x there’s is no equivalent to the inotify-tools but it is extremely easy to create so this is what I’ll do here.

I’ve created a small tool that I call watchdir (see source below). It can be used as a command in a script and takes two arguments namely the name of the directory to watch and optionally a timeout. Feel free to steal it and elaborate on it.

Example:

watchdir /foo/bar

will wait indefinitely for changes to the /foo/bar directory. When a change happens the command will return. See return codes in source code below.
Compile and build

This is the easy part. All you have to do is this:

First take the C source code that you find on this page and put it into a new file called watchdir.c.

(if using GNU C/C++ Compiler)

pkg install pkg://solaris/developer/gcc-45
pkg install pkg://solaris/system/header
gcc watchdir.c -o watchdir

or

(if using Solaris Studio Compiler)

# Install steps for Solaris Studio compiler not shown here
cc watchdir.c -o watchdir

After this you now have a binary called ‘watchdir’ that you can use in scripts, etc. It is pretty self-explanatory. Have a look at the header of the source code which explains how to use it.
Source code
/* ************************************************************************
* watchdir.c
*
* watchdir uses Solaris’ File Event Notification system to monitor
* a directory for changes. It is in this respect similar in use case
* to Linux’s inotify-tools.
*
* This method of monitoring a directory is far superior to any
* alternative that would probably use looping and some sort of polling.
*
* watchdir is particularly useful in shell scripts that need to monitor
* a directory for changes.
*
* USAGE:
* Syntax is: watchdir dirname [timeout]
*
* Where
* dirname is the name of the directory to watch (mandatory)
* timeout is the number of seconds to wait for change. If not
* specified the command will wait forever for a change.
*
* watchdir will wait for a change to happen on the monitored directory.
* A change is anything that modifies the directory such as a new file,
* deletion of a file, rename of a file, etc. However file access is
* deliberately not monitored and will not cause the command to stop.
*
* Return value:
* 0 – if the command completes successfully because a change happens on
* the monitored directory.
* 1 – if there was a problem during the initialization, for example
* invalid parameters, memory allocation errors, etc.
* 2 – if the directory was changed abruptly while it was being monitored
* such as if the directory was deleted, renamed or if the file system
* was unmounted.
* 99 – if the command times out before change happens.
*
*
*
* COMPILE:
*
* cc watchdir.c -o watchdir
*
*
*
* LICENSE:
*
* This is free and unencumbered software released into the public domain.
*
* Anyone is free to copy, modify, publish, use, compile, sell, or
* distribute this software, either in source code form or as a compiled
* binary, for any purpose, commercial or non-commercial, and by any
* means.
*
* In jurisdictions that recognize copyright laws, the author or authors
* of this software dedicate any and all copyright interest in the
* software to the public domain. We make this dedication for the benefit
* of the public at large and to the detriment of our heirs and
* successors. We intend this dedication to be an overt act of
* relinquishment in perpetuity of all present and future rights to this
* software under copyright law.
*
* THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* For more information, please refer to
*
* ************************************************************************
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include

struct fileinfo {
struct file_obj fobj;
int events;
int port;
};

/*
* event handler for file events source.
*/
int process_event(struct fileinfo *finf, int revents)
{
struct file_obj *fobjp = &finf->fobj;
int port = finf->port;

if (revents > 0) {

/*
* If there was an exception we treat it like
* an error.
*/
if (revents & FILE_EXCEPTION) {
return(2);
}

return(0);
}
if (revents == 0) {
/* Don’t think we will ever see this */
return(20);
}
return(0);
}

void print_syntax()
{
fprintf(stdout, “\n”);
fprintf(stdout, “watchdir will watch a directory for changes using Solaris’ File Events Notification.\n”);
fprintf(stdout, “This means no polling and zero overhead compared to monitoring a directory in a loop.\n”);
fprintf(stdout, “\n”);
fprintf(stdout, “Syntax:\n”);
fprintf(stdout, ” watchdir dirname [timeout]\n”);
fprintf(stdout, “\n”);
fprintf(stdout, “where:\n”);
fprintf(stdout, ” dirname is the name of the directory to watch (mandatory)\n”);
fprintf(stdout, ” timeout is the number of seconds to wait for a change. If not specified the command\n”);
fprintf(stdout, ” will wait forever for a change on the monitored directory.\n”);
fprintf(stdout, “\n”);
}

/*
* Tests if the argument is a positive integer.
*/
int is_integer(char *str)
{

int i=0;
for (i = 0; i < strlen(str); i++)
{
if (!isdigit(str[i])) return(0);
}
return(1);
}

int main(int argc, char *argv[])
{
struct fileinfo *finf;
int port;
char *stp;
struct stat sb;
port_event_t pe;
int process_event_result;
struct timespec timeout;
int uses_timeout=0;

if (( argc 3)){
if (argc != 1) fprintf(stderr, “Error: Incorrect syntax.\n”);
print_syntax();
return(1);
}

if ( argc == 3) {
if (!is_integer(argv[2])) {
fprintf(stderr, “Error: %s is not an integer.\n”, argv[2]);
return(1);
} else {
uses_timeout=1;
timeout.tv_sec = atoi(argv[2]);
timeout.tv_nsec = 0;
}
}

if ((port = port_create()) == -1) {
perror(“Error: Function port_create() failed.”);
}

finf = malloc(sizeof(struct fileinfo));
if (finf == NULL) {
perror(“Error: memory alloc”);
return(1);
}

if ((finf->fobj.fo_name = strdup(argv[1])) == NULL) {
perror(“Error : strdup”);
free(finf);
return(1);
}

if ( stat(finf->fobj.fo_name, &sb) == -1) {
perror(“Error: Failed to stat file”);
fprintf(stderr, “Make sure \”%s\” is an existing and accessible directory.\n”, finf->fobj.fo_name);
free(finf->fobj.fo_name);
free(finf);
return(1);
}

if ( ! (sb.st_mode & S_IFDIR) ) {
fprintf(stderr, “Error: \”%s\” is not a directory.\n”, finf->fobj.fo_name);
return(1);
}

/*
* Event types to watch.
*/
finf->events = FILE_MODIFIED|FILE_ATTRIB;
finf->port = port;

/*
* Register.
*/
struct file_obj *fobjp = &finf->fobj;
finf->fobj.fo_atime = sb.st_atim;
finf->fobj.fo_mtime = sb.st_mtim;
finf->fobj.fo_ctime = sb.st_ctim;
if (port_associate(port, PORT_SOURCE_FILE, (uintptr_t)fobjp,
finf->events, (void *)finf) == -1) {
/*
* Add error processing as required, file may have been
* deleted/moved.
*/
perror(“Error: Failed to register file”);
fprintf(stderr, “Failed to register file :%s – errno %d\n”,
finf->fobj.fo_name, errno);
free(finf->fobj.fo_name);
free(finf);
return(1);
}

/*
* Listen for events
*/
if (!port_get(port, &pe, (uses_timeout) ? &timeout : NULL)) {
/*
* Can add cases for other sources if this
* port is used to collect events from multiple sources.
*/
switch (pe.portev_source) {
case PORT_SOURCE_FILE:
/* Call file events event handler */
process_event_result = process_event((struct fileinfo *)pe.portev_object, pe.portev_events);
break;
default:
/*
* Don’t really see this as happening … ever !
*/
perror(“Error: Event from unexpected source”);
return(3);
}
} else {
if (errno == ETIME) {
/* Timeout */
return(99);
} else {
perror(“Error while listening for file events “);
return(10);
}
}

/*
* close port, will de-activate all file events watches associated
* with the port.
*/
close(port);

return(process_event_result);
}
view raw
watchdir.c hosted with ❤ by GitHub
Example usage

Here’s a Bash example of how watchdir can potentially be used from within a shell script.
#!/bin/bash
#
# Script example of use of ‘watchdir’
#
# Imagine you have directory, $NOTIF_DIR, that you would
# like to monitor for new files. Whenever somebody put a new
# file into $NOTIF_DIR your script should take some action.
# The purpose of this script is to show how this can be done
# using watchdir.
#
# In the old days, before watchdir, the only way to solve
# this problem would be to scan the directory at regular intervals,
# say every 5 seconds. This approach would obviously take up system
# resources. Using watchdir is a much better approach because it
# doesn’t consume system resources and there’s immediate notification.
#

# The directory we would like to monitor
NOTIF_DIR=/foo/bar

# Loop forever
while true; do

echo “Waiting for new file in directory : $NOTIF_DIR”

# Now we start watching the $NOTIF_DIR. This will take up
# zero system resources. Once something happens on $NOTIF_DIR
# the script will continue. We will wait forever for something
# to happen (as there’s no second argument to watchdir command).
watchdir $NOTIF_DIR

# We now know that something has happened on $NOTIF_DIR
# (we do not actually know *what* has happened)

# Loop over the files in the directory.
for newfile in `ls $NOTIF_DIR`; do

# If it is a regular file
if [ -f “$newfile” ]; then

# Do something with ‘newfile’
echo “Processing file $newfile”

# We are finished with ‘newfile’ so we can delete it again.
rm -r -f $NOTIF_DIR/$newfile
fi
done

done
view raw
watchdir-usage-example.sh hosted with ❤ by GitHub
To do

There are many extensions that can be done from this and certainly watchdir is nowhere as flexible as the inotifywait command in Linux. Having said that it is more than sufficient for my purpose. I haven’t actually had a need for something more advanced.

It currently triggers on FILE_MODIFIED or FILE_ATTRIB (source code line 207). In this case remember that ‘file’ is really a directory, because that is what we’re watching. If somebody puts a new file into the directory or deletes a file from the directory this will modify the directory and since we’re subscribing to ‘MODIFIED’ events we’ll get a callback. The reason for also using FILE_ATTRIB eludes me (it is some months since I wrote this) but I guess the thinking was that I also wanted to be notified if somebody made the directory read-only .. or something. You can play with this and find the combination that fits your purpose. Or you could change the source code and have such options as part of the command line input.
Credit

The source code is highly inspired / stolen from Prakash Sangappa’s blog. I’ve cleaned it up, made some more source code comments and most of all I’ve made it operational as a command line tool. Feel free to grab it, steal it, etc. And Oracle if you’re listening: I would like to see something like this become part of core Solaris.
Share this:

Press ThisTwitterFacebook

‹ Why STARTTLS ?
Samba 4 on Solaris 11 ›
Posted in Uncategorized
33 comments on “Solaris File Event Notification”

Philipp Speck says:
September 11, 2013 at 8:12 pm

I tried to compile it under Solaris 11.1 with gcc like you described, but the compiler fails with a lot of errors and warnings.
Reply
petersblogwp says:
September 11, 2013 at 11:32 pm

@philipp. I just did it again to make sure. No probs. Feel free to post the errors you’re seeing when you execute gcc.
Reply
Philipp Speck says:
September 13, 2013 at 5:47 am

./watchdir.c:74:9: error: #include expects “FILENAME” or
./watchdir.c:75:9: error: #include expects “FILENAME” or
./watchdir.c:78:9: error: #include expects “FILENAME” or
./watchdir.c:79:9: error: #include expects “FILENAME” or
./watchdir.c:80:9: error: #include expects “FILENAME” or
./watchdir.c:81:9: error: #include expects “FILENAME” or
./watchdir.c:82:9: error: #include expects “FILENAME” or
./watchdir.c:85:25: error: field ‘fobj’ has incomplete type
./watchdir.c: In function ‘process_event’:
./watchdir.c:104:27: error: ‘FILE_EXCEPTION’ undeclared (first use in this function)
./watchdir.c:104:27: note: each undeclared identifier is reported only once for each function it appears in
./watchdir.c: In function ‘print_syntax’:
./watchdir.c:119:3: warning: incompatible implicit declaration of built-in function ‘fprintf’
./watchdir.c:119:11: error: ‘stdout’ undeclared (first use in this function)
./watchdir.c: In function ‘is_integer’:
./watchdir.c:140:25: warning: incompatible implicit declaration of built-in function ‘strlen’
./watchdir.c: In function ‘main’:
./watchdir.c:153:9: error: ‘port_event_t’ undeclared (first use in this function)
./watchdir.c:153:22: error: expected ‘;’ before ‘pe’
./watchdir.c:159:28: warning: incompatible implicit declaration of built-in function ‘fprintf’
./watchdir.c:159:36: error: ‘stderr’ undeclared (first use in this function)
./watchdir.c:166:17: warning: incompatible implicit declaration of built-in function ‘fprintf’
./watchdir.c:179:16: warning: incompatible implicit declaration of built-in function ‘malloc’
./watchdir.c:185:35: warning: incompatible implicit declaration of built-in function ‘strdup’
./watchdir.c:187:13: warning: incompatible implicit declaration of built-in function ‘free’
./watchdir.c:193:13: warning: incompatible implicit declaration of built-in function ‘fprintf’
./watchdir.c:194:13: warning: incompatible implicit declaration of built-in function ‘free’
./watchdir.c:200:13: warning: incompatible implicit declaration of built-in function ‘fprintf’
./watchdir.c:207:24: error: ‘FILE_MODIFIED’ undeclared (first use in this function)
./watchdir.c:207:38: error: ‘FILE_ATTRIB’ undeclared (first use in this function)
./watchdir.c:217:34: error: ‘PORT_SOURCE_FILE’ undeclared (first use in this function)
./watchdir.c:224:17: warning: incompatible implicit declaration of built-in function ‘fprintf’
./watchdir.c:225:45: error: ‘errno’ undeclared (first use in this function)
./watchdir.c:226:17: warning: incompatible implicit declaration of built-in function ‘free’
./watchdir.c:234:30: error: ‘pe’ undeclared (first use in this function)
./watchdir.c:252:30: error: ‘ETIME’ undeclared (first use in this function)
petersblogwp says:
September 13, 2013 at 7:59 am

See reply elsewhere on this page. The source code listing on the blog post has been updated.
Philipp Speck says:
September 11, 2013 at 9:18 pm

Even with Oracle Solaris Studio 12.3: cc: acomp failed for watchdir.c
Reply
petersblogwp says:
September 13, 2013 at 6:30 am

@philipp. Apologies. This was a some kind of cut’n paste error into WordPress where WordPress had stolen “” from the text, but only some of them (lines 74-82 in source source code). I cannot really explain why but I have now reposted the source code and this time I’ve done a proper check, i.e. I’ve copied the text from the Blog page into vi, saved it and tried to compile it. That works for me.
Reply
Philipp Speck says:
September 13, 2013 at 11:27 am

Yes, it works now! I compiled it with openindiana and gcc-3. Thank you!
Reply
Philipp Speck says:
September 13, 2013 at 11:28 am

Do you know gist.github.com? It’s better for code than WordPress and you can embedd your code in site. You can delete this comment after reading.
Reply
Philipp Speck says:
September 13, 2013 at 12:37 pm

It’s working so far. But could you add an example in your blog how you use it in shell script?
Reply
petersblogwp says:
September 13, 2013 at 1:39 pm

Done! See above.
Reply
Philipp Speck says:
September 14, 2013 at 1:14 pm

Many thanks! A very useful tool and a missing feature in Solaris. I’ve startet to translate this post in german. I will post it in my blog soon – of course with a permalint to yours. As your license allows me to, I will publish your original code in gist.github.com, if you don’t want to do it. You agree?
Reply
petersblogwp says:
September 16, 2013 at 6:11 am

Feel free to post the code on gist.github.com.
Reply
OpenIndiana/Solaris File Event Notification – Designstudio, Philipp Speck says:
September 14, 2013 at 1:44 pm

[…] ist die deutsche Übersetzung von Peters Blog Rants about the Solaris OS – Solaris File Event Notification Angenommen, Sie benötigen ein Shell-Script, das irgendeinen Befehl ausführt, sobald eine neue […]
Reply
Philipp Speck says:
September 14, 2013 at 7:35 pm

Here is my german translation: http://www.destio.de/openindiana/watchdir/
Reply
Philipp Speck says:
September 20, 2013 at 1:08 pm

As I understand the code, watchdir monitors directory changes and modified attributes only. So it’s not possible to return the file name which was triggering the event?
Reply
petersblogwp says:
September 20, 2013 at 6:25 pm

That is correct. Actually I don’t think the underlying Solaris File Events Notification (FEN) mechanism has a way of giving that information so it is not because of the watchdir implementation as such.

If you look at my script example I assume (in that example) that the directory is always empty during wait time. When watchdir completes, i.e. it returns because something has happened on that directory, I then loop over the contents in the directory. Here I simply ASSUME that watchdir was woken up because somebody put a file (or several files) into that directory. There can potentially be other reasons why watchdir was woken up and I should probably test for those using watchdir’s exit value. If watchdir‘s exit value is 0 (zero) then there can be no other reason than something has happened inside the directory. In the example I’m only interested in regular files so I filter everything else away and do not react upon it. Suppose somebody creates a directory inside the directory that watchdir is watching. This will also wake up watchdir and also with an exit value of zero. But I’m not interested in that so I filter it out.

Given that the Solaris File Events Notification (FEN) mechanism will not tell you exactly WHAT has happened when watching a directory you’ll have to apply logic along the same lines as explained for my script example.
Reply
garychow says:
August 18, 2014 at 7:49 pm

i ran gcc watchdir.c -o watchdir

and i am getting errors , the following

gcc watchdir.c -o watchdir
gcc: watchdir.c: No such file or directory
gcc: no input files
Reply
petersblogwp says:
August 18, 2014 at 8:12 pm

You have to take the source code from this page and put it into a new file called watchdir.c on your system. Then you can compile and build as described.
Reply
garychow says:
August 18, 2014 at 7:53 pm

what is the difference between FENS and watchdir
Reply
petersblogwp says:
August 18, 2014 at 8:07 pm

Never heard about the “FENS” abbreviation. Sometimes the ability for Solaris 11 to detect file system changes and ‘report’ them is called FEN (File Event Notification). So FEN would be the name of the ability or perhaps we can say it’s the name of the API. FEN in itself is not operable. It’s just an API. Unfortunately that’s where Sun/Oracle stopped. Not very useful, unless you know C and can build something on top of it, that can then be used from a script or the like.

This is what watchdir is. watchdir is a specific implementation that uses FEN.
Reply
garychow says:
August 18, 2014 at 8:58 pm

thanks but i got it to work but not completely, its failing on # Do something with ‘newfile’
just a simple echo is not working , probably a silly mistake on my part
Reply
petersblogwp says:
August 18, 2014 at 9:09 pm

The shell script is meant as an example stub that uses watchdir. In the shell script in line 44-45 there are some dots to mark that you should put your own stuff there. Perhaps that’s the problem you’re encountering?. Just remove those lines ..but then of course the script will not really do anything.
Reply
garychow says:
August 18, 2014 at 9:16 pm

Thanks peter for thee quick response, even after removing the dots a simple echo wont work
Reply
petersblogwp says:
August 18, 2014 at 9:24 pm

Then I’m guessing you have some kind of cut’n paste error. WordPress is a lousy platform for code snippets. When you copy something off this page and paste it into something else you’ll for example see quotes becoming ampersand quote; and what not.
Reply
petersblogwp says:
August 18, 2014 at 9:29 pm

Yep. After a short test I’m pretty sure that’s your problem. Look for places where double quotes in the original text have been replaced with nonsense chars. I’ll consider publishing the code somewhere else so that it is easier to grab.
garychow says:
August 18, 2014 at 9:34 pm

great thanks
Reply
petersblogwp says:
August 19, 2014 at 6:48 am

The source code on this page is now no longer inside WordPress itself (which was the source of cut’n paste problems that people experienced). Instead the source code is now hosted on GitHub.
Reply
Bart Smaalders says:
February 17, 2015 at 12:53 am

The reason Solaris File Event Notification doesn’t include the file name is that this would either require the kernel to buffer all events for all consumers (no matter how slow), or provide a different event that meant: ‘Too much data, check it yourself’. The first case makes a DOS attack trivial, the second produces code in applications which is rarely tested and thus will likely not work.

– Bart
Reply
petersblogwp says:
February 17, 2015 at 6:43 pm

Thanks Bart. This design choice makes sense to me now when explained like that.
Reply
ntamblyn says:
August 5, 2015 at 2:10 pm

I cant get this to compile

watchdir.c: In function ‘process_event’:
watchdir.c:97:35: error: ‘amp’ undeclared (first use in this function)
watchdir.c:97:35: note: each undeclared identifier is reported only once for each function it appears in
watchdir.c:106:29: error: expected ‘)’ before ‘;’ token
watchdir.c: In function ‘main’:
watchdir.c:200:40: error: ‘amp’ undeclared (first use in this function)
watchdir.c:200:43: error: expected ‘)’ before ‘;’ token
watchdir.c:209:32: error: expected ‘)’ before ‘;’ token
watchdir.c:248:33: error: expected ‘)’ before ‘;’ token
watchdir.c:248:33: error: too few arguments to function ‘port_get’
/usr/include/port.h:24:5: note: declared here
Reply
petersblogwp says:
August 9, 2015 at 4:25 pm

Corrected. It was a web paste error where ampersands got screwed up. My mistake.
Reply
alex kuzmenko says:
February 20, 2018 at 3:22 pm

how to setup for monitoring sub dir?
Reply
petersblogwp says:
February 21, 2018 at 5:54 am

The tool doesn’t currently recurse into sub-dirs. This is a feature that would have to be added either in the C program (probably most efficient) or in a Bash wrapper. I’ve posted the code as an example. It can easily be expanded upon.
Reply

Leave a Reply

Logged in as eklausmeier. Log out?

Comment

Notify me of new comments via email.

Notify me of new posts via email.
Recent Posts

Samba 4 on Solaris 11
Solaris File Event Notification
Why STARTTLS ?
Creating a fairly secure public SSH daemon
Postfix on Solaris 11

Archives

June 2014
July 2013
December 2012
September 2012
August 2012

Categories

Uncategorized

Meta

Log out
Entries feed
Comments feed
WordPress.com

© 2020 Rants about the Solaris OS

Blog at WordPress.com.
Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use.
To find out more, including how to control cookies, see here: Cookie Policy

zdnet.com: Build your own monster AMD Ryzen Threadripper 3990X system for under $7,000

zdnet.com: Build your own monster AMD Ryzen Threadripper 3990X system for under $7,000

By Adrian Kingsley-Hughes for Hardware 2.0 | February 17, 2020 — 13:40 GMT (13:40 GMT) | Topic: Hardware

Got your eye on AMD’s new silicon behemoth, the 64-core, $3,990 Ryzen Threadripper 3990X CPU? Here’s what you need to build a complete system.

Got your eye on the new monster 64-core AMD Ryzen Threadripper 3990X CPU? With the CPU itself costing almost the same as four iPhone 11 Pro Max handsets, a system like this is never going to be classed as “budget” or “affordable,” but you will get an absolute beast of a system that will tackle pretty much anything you can throw at it.

So, here’s what you need:

Disclosure: ZDNet may earn an affiliate commission from some of the products featured on this page. ZDNet and the author were not compensated for this independent review.
AMD Ryzen Threadripper 3990X
Let’s start with the CPU

Here’s the core of the build — the AMD Ryzen Threadripper 3990X. The core count is a world’s first for a HEDT (High-End Desktop) processor, and it is squarely aimed at the high-end 3D rendering, visual effects, and video professionals.

CPU Socket Type: Socket sTRX4
# of Cores: 64-Core
# of Threads: 128
Operating Frequency: 2.9 GHz
Max Turbo Frequency: Up to 4.3 GHz
L1 Cache: 4MB
L2 Cache: 32MB
L3 Cache: 256MB
Architecture: 7nm
RAM Types: DDR4 3200
Memory Channel: 4
PCI Express Revision: 4.0
Thermal Design Power: 280W

$3,990 at Newegg

Must read: Don’t buy these Apple products: February 2020 edition
GIGABYTE TRX40 AORUS MASTER

The Motherboard

There are over a dozen Socket TRX40 motherboards available, and one of those is the GIGABYTE TRX40 AORUS MASTER (the processor socket is different to older Threadripper CPUs).

Apart from having an updated socket, this board is designed from the ground up to cope with the thermal demands of the Threadripper 3990X. It also features a whole host of things you expect on a high-end board, from 3 x M.2 ports, support for 256GB of RAM, 6 x SATA ports, and loads of USB ports.
$500 at Newegg
G.SKILL Trident Z Neo Series 32GB (4 x 8GB) RAM
The RAM
2020-02-17-13-10-25.jpg

The motherboard supports 256GB of RAM, but let’s curtail out enthusiasm by only — only! — installing 32GB.

Capacity: 32GB (4 x 8GB)
Type: 288-Pin DDR4 SDRAM
Speed: DDR4 3800 (PC4 30400)
CAS Latency: 14
Timing: 14-16-16-36
Voltage: 1.5V
Heat Spreader: Yes
Features: Designed and tested for AMD Ryzen 3000 series CPUs, optimized compatibility with AMD X570 chipset, sleek dual-tone aluminum heatspreader design, and fully customizable RGB lighting support

$480 at Newegg
Samsung 970 EVO M.2 2280 2TB SSD
The Storage
2020-02-17-13-14-35.jpg

Since the motherboard has support for three M.2 drives, and this is a high-performance system, we might as well make use of them by installing a 2TB Samsung 970 EVO M.2 2280 SSD (if you feel you need more space, add another, or some spinning storage to suit).

Form Factor: M.2 2280
Capacity: 2TB
Memory Components: 64L V-NAND MLC
Interface: PCIe Gen3. X4, NVMe 1.3
Controller: Samsung Phoenix Controller
Cache: 2GB LPDDR4 DRAM

$700 at Newegg
XFX Radeon VII RX-VEGMA3FD6 16GB 4096-Bit HBM2
The Graphics Card
2020-02-17-13-18-51.jpg

A powerful CPU needs a powerful GPU, and they don’t come much more powerful than this XFX Radeon VII. If one isn’t enough, you can throw a few more into the system!

Core Clock: 1400 MHz
Boost Clock: 1750 MHz
Stream Processors: 3840 Stream Processors
Effective Memory Clock: 1 GHz (2.0 Gbps)
Memory Size: 16GB
Memory Interface: 4096-Bit
Memory Type: HBM2
Max Resolution: 4096 x 2160
Cooler: Triple Fans
Thermal Design Power: 295W

$550 at Newegg
Cooler Master Wraith Ripper
The Cooler
2020-02-17-13-25-09.jpg

No, a CPU that costs almost $4,000 doesn’t come with a cooler!

This seven heatpipe, dual heatsink cooler is more than up to the job of cooling the Threadripper 3990X!
$222 at Newegg
Seasonic PRIME TX-1000 Ultra-Titanium 1000W PSU
The Power Supply Unit
2020-02-17-13-29-14.jpg

A fully-modular PSU (which helps reduce clutter and helps increase airflow) that features a Fanless Mode for when quiet is needed. But this unit comes with everything you need to power a monster PC.
$280 at Newegg
Windows 10 Pro
The Operating System

There’s some debate about whether the 54-core/128-thread Threadripper 3990X will work optimally with Windows 10 Pro, or whether it needs Windows 10 Pro for Workstation. Early testing suggested Windows 10 Pro created bottlenecks, but a statement from AMD claimed this was a testing error on the part of the tester.
$200 at Newegg

The starting price for this system is $6,922, but if you start adding multiple M.@ SSDs, more GPUs, or you want to take the RAM up closer to the 256GB limit, then this will quickly spiral upwards!

zdnet.com: Look what’s inside Linus Torvalds’ latest Linux development PC

zdnet.com: Look what’s inside Linus Torvalds’ latest Linux development PC

The Linux creator recently announced he’d upgraded his main PC to a speedy AMD Threadripper 3970x-based processor. But a computer is more than a CPU. In an exclusive conversation, Torvalds talked about what’s what with his latest system.

By Steven J. Vaughan-Nichols for Linux and Open Source | May 27, 2020 — 13:59 GMT (14:59 BST) | Topic: PCs

In a Linux Kernel Mailing List (LKML), Linus Torvalds, Linux’s top developer, talked about the latest progress in the next version of Linux: Linux 5.7-rc7. Along the way, he mentioned, “for the first time in about 15 years, my desktop isn’t Intel-based.” In his newest development box, he’s “rocking an AMD Threadripper 3970x.” But a computer is more than just a processor no matter how speedy it is, so I talked with Torvalds to see exactly what’s in his new box.

First, he’s already impressed by its performance:

“My ‘allmodconfig’ test builds are now three times faster than they used to be, which doesn’t matter so much right now during the calming down period, but I will most definitely notice the upgrade during the next merge window,” said Torvalds.

The AMD Threadripper 3970x comes with 32 cores. It’s built using AMD’s 7-nanometer “Zen 2” core architecture, and it boasts 88 PCIe 4.0. AMD claims it’s up to 90% faster than its competition. Phoronix’s independent tests found the “Threadripper 3970X absolutely dominates in performance and “outpaces the Core i9 10980XE.”

Torvalds is a build-your-own box type of guy.

“I typically build all my own machines. Usually they are frankenboxes — I’ll re-use the case or the SSD from the previous machine or something like that. This time it was an all-new build,” he said.

Why do it yourself?

“I don’t like having others build my machine, partly because I have my own specs I care most about, but partly I get self-conscious about getting donations that I no longer really need,” Torvalds said.

Before this latest build, his box was an i9-9900k. Normally, Torvalds would just pop into the local Fry’s to pick up some of the more basic stuff directly, but with the virus, this time it was all from Amazon. The pieces came in over a few weeks (no more two-day shipping of computer parts these days); the last two pieces came last Friday.

So, here’s Torvald’s annotated hardware list:
disclosure

ZDNet may earn an affiliate commission from products featured on this page.

CPU

See it now: Ryzen Threadripper 3970X

“Initially, my plan was actually to do an AM4 board and just a Ryzen 3950X, which is the more mainstream upgrade,” Torvalds said, but the “Ryzen 3950X would have been an upgrade over the Intel i9-9900K, but it would only have been an incremental one.”

“Normally, I go for the regular consumer CPU’s, since they tend to be the best bang for the buck, and in the case of Intel CPU’s I actually like that they just have integrated graphics. I don’t care about the GPU very much, so an integrated one is fine, and it avoids the worry about picking the right GPU and possible noise-levels from one with bad fans.”

Torvalds went “back-and-forth about that for a while,” because, as he said:

“The Threadripper power use made me worry about noise. But I decided to do a big upgrade because unlike the traditional Intel Xeon high-core-count platform, AMD’s Threadripper series still falls in the ‘good bang for the buck.’ So I bit the bullet, and am so far quite pleased.”

Motherboard

See it now: Gigabyte Aorus TRX40 Master

Here, Torvald’s main concern was:

“A board that had what looked like good power delivery and fan control. In the builds I do, I really want the basics to be solid, and there’s little more basic than power delivery. Long long ago I had a couple of systems that were unreliable due to power brown-out, and I’ve gotten religious about this now. So I look for something that is good for overclocking, and then I do _not_ overclock things.”

In short, he wants a PC that can handle a heavy load, but he’s not going to push the machine to its limits. That said, Torvalds absolutely detests:

“The default fan settings of this motherboard (very whiny small high-RPM fan for VRM [Voltage Regulator Module] cooling), but you can tweak the BIOS settings to something much better. Also note to anybody else: This is an E-ATX board, so it can be inconvenient in the wrong case.”

Fan

See it now: Noctua NF-A14 PWM, Premium Quiet Fan

As you can tell, noise is a big issue for Torvalds. He cares deeply about it:

“So I want good fans and coolers, and I’ve had good experiences with Noctua before,” Torvalds said. “The extra fan is because I like that push-pull setup, and with a big 140mm Noctua fan running at low speed, I’m not worried about noise levels. Even when it ramps up under load, I don’t find the noise of those fans annoying. It’s more of a soothing ‘whoosh” white noise sound, none of the annoying whining or rattling that you get with bad fans.”

CPU Cooler

See it now: Noctua NH-U14S and Noctua NF-A15

Torvalds uses two CPU cooler fans. The NH-U14S is the main one, while the extra NF-A15 fan is for the push-pull configuration of that cooler.

With all his concern about noise, why not water-cooling, you ask?

“I’m not a fan of water-cooling. Reliability worries me, and I’m not convinced the AIO systems are any better than a good air cooling system. And the custom ones are way too much effort, and I worry about the pump and gurgling noises,” Torvalds said.

Case

See it now: Be Quiet Dark Base 700

For the case, it’s once again all about noise reduction.

“I like Noctua fans better than the Be Quiet ones for some reason. But Be Quiet would have been my second choice, and Noctua doesn’t make cases,” he said.

Extra fan

See it now: Silent Wings 3

Why an extra fan? Torvalds explained:

“The extra fan (the case comes with two already) is because I initially ordered the case, and then when looking at it I decided that it looks like the front intake looks more restricted than the back output (because of the front panel), and since I was waiting for other parts to be delivered anyway, I decided that an extra intake fan would be better for airflow, and hopefully cause positive case pressure and less worry about dust.”

In the end, all the effort to make a quiet powerful PC was worth it.

“With the right fan control setup in the BIOS (and assuming you picked the right fan headers: The motherboard paper manual had horrible pictures and I got the CPU and system fan header the wrong way round for the first build), you have a machine that is basically silent when idling, and without any annoying whine (but not silent) under full load.”

Power Supply Unit

See it now: Seasonic Focus GX-850

The GX-850 wasn’t Torvald’s first choice, but availability during the time of the coronavirus made it what it is, but “it should be solid,” Torvalds said. He cares deeply about power delivery basics:

“I basically go ‘what’s the top power use of the machine?,’ and then pick a power supply with a rating 2x that, and then look for reviews and reputable brands.”

Storage

See it now: 1TB Samsung EVO 970

When it comes to storage, Torvalds is solid-state drives (SSD) all the way:

“I’ve refused to touch spinning media for over a decade by now, and for the last several generations I’ve tried to avoid the hassle with cabling, etc., by just going with an m.2 form factor. I’ve had several of the Samsung SSD’s, they’ve been fine. A few generations ago there were lots of bad SSD’s, these days it’s much less of an issue, but I’ve stuck with what works for me.”

Memory

See it now: 4x16GB DDR4-2666

RAM proved to be a sore spot for Torvalds:

“This is actually the least favorite part of the build for me — it’s fine memory, but I really wanted ECC [Error-correcting code} memory. I had a hard time finding anything [priced sanely] on Amazon, so this I feel is a temporary ‘good enough for now’ thing that works fine in practice.”

Besides, he continued:

“I don’t actually even need 64GB of RAM, since the stuff I do doesn’t tend to be all that memory-intensive, but I wanted to populate all four memory channels, and RAM is cheap.”

While games and artificial intelligence and machine learning developers care deeply about graphics, video and image processing doesn’t interest Torvalds much. He used:

“Some random Sapphire RX580 graphics card. It’s overkill for what I do (desktop use, no games).”

Linux

See it now: Fedora 32

That’s it.

“Slap it all together, make sure you get all the fan settings right, and (in my case) install Fedora 32 on it, and you’ve got a fairly pleasant workstation,” Torvalds said.

While for his main workstation, Torvalds builds his own, he also has cutting edge OEM PCs for “access to new technology that I might not otherwise have bought myself.”

For his laptop, he uses a Dell XPS 13.

“Normally, Torvalds said, “I wouldn’t name names, but I’m making an exception for the XPS 13 just because I liked it so much that I also ended up buying one for my daughter when she went off to college.

Torvalds concluded:

“If the above makes you go ‘Linus has too much hardware,’ you’d be right. Usually I have one main box, and usually it’s something I built myself.”

Related Stories:

Build your own monster AMD Ryzen Threadripper 3990X system for under $7,000
AMD unveils world’s most powerful desktop CPUs
Linus Torvalds: ‘I’m not a programmer anymore

schedulix: The Open Source Enterprise Job Scheduling System

schedulix: The Open Source Enterprise Job Scheduling System

schedulix

Home
Highlights
Features
FAQ
Videos
Support
Downloads
Contact
Forum
User Feedback
News
Deutsch

The schedulix Feature Set
A solution for every task
schedulix Features
schedulix offers a huge seature set, which enables you, to meet all requirements considering your IT process automation in an efficient and elegant way.
User-defined exit state model

Complex workflows with branches and loops can be realised using batch hierarchies, dependencies and triggers by means of freely definable Exit State objects and how they are interpreted.
Job and batch dependencies

You can make sure that individual steps of a workflow are performed correctly by defining Exit State dependencies. Dependencies can be specified more precisely in addition to the required exit state by defining a condition.
Branches

Branches can be implemented in alternative sub-workflows using dependencies that have the exit state as a condition.
Hierarchical workflow modelling

Among other benefits, hierarchical definitions for work processes facilitate the modelling of dependencies, allow sub-processes to be reused and make monitoring and operations more transparent. The additional Milestone object type makes it easier to model complex workflows.
Job and batch parameters

Both static and dynamic parameters can be set for Submit batches and jobs.
Job result variable

Jobs can set any result variables via the API which can then be easily visualised in the Monitoring module.
Dynamic submits

(Sub-)workflows can be dynamically submitted or paralleled by jobs using the Dynamic Submit function.
Pipelining

Local dependencies between parts of the submitted batch instances are correctly assigned when parallelising batches using the Dynamic Submit function. This hugely simplifies the processing of pipelines.
Job and batch triggers

Dynamic submits for batches and jobs can be automated using exit state-dependent triggers.
This allows notifications and other automated reactions to workflow events to be easily implemented. In addition to the exit state and trigger type, events can also be specified more precisely by defining a condition. Asynchronous triggers enable events to be triggered during runtime. This also allows for reactions to runtime timeouts.
Loops

Automatic reruns of sub-workflows can be implemented by using triggers.
External jobs

So-called ‘pending’ jobs can be defined to swap out sub-workflows to external systems without overloading the system with placeholder processes.
Folders

Job, Batch and Milestone workflow objects can be orderly organised in a folder structure.
Folder parameters

All jobs below a folder can be centrally configured by defining parameters at folder level.
Folder environments

Requirements for static resources can be configured to be inherited by all jobs below a folder by defining folder environments.
This allows jobs to be assigned to different runtime environments (development, test, production, etc.) dependent upon a higher-level folder.
Folder resources

Resources can also be globally instanced at folder level as well as in the workflow environment, making them available to all the jobs below this folder.
Job and batch resources

Instancing resources at batch or job level allows a workflow load generated by hierarchically subordinate jobs to be locally controlled.
Static resources

Static resources can be used to define where a job is to be run. If the requested resources are available in multiple environments, the jobs are automatically distributed by the schedulix Scheduling System.
Load control

A quantity of available units of a resource can be defined for runtime environments using system resources. A quantity can be stated in the resource requirement for a job to ensure that the load on a resource is restricted.
Job priority

The job priority can be used to define which jobs are to take priority over other jobs when there is a lack of resources. Jobs can be prevented from ‘starving’ with an individually configured ‘priority aging’ which automatically raises their priority over the time span.
Load balancing

The interplay of static and system resources allows jobs to be automatically distributed over different runtime environments dependent upon which resources are currently available.
Synchronizing resources

Synchronising resources can be requested with different lock modes (no lock, shared, exclusive, etc.) or assigned them for synchronising independently started workflows.
Sticky allocations

Synchronising resources can be bound to a workflow across multiple jobs with sticky allocations to protect critical areas between two or more separately started workflows.
Resource states

A state model can be assigned to synchronising resources and the resource requirement can be defined dependent upon the state.
Automatic state changes can be defined dependent upon a job’s exit state.
Resource expirations

Resource requirements can define a minimum or maximum time interval in which the resource was assigned a new state. This allows actuality and queue conditions to be easily implemented.
Resource triggers

A reaction to the changing states of synchronising resources can be triggered with an automatic submit of a batch or job. After the state transition, the activation of the trigger can be more precisely specified with an extra condition.
Resource parameters

Resource parameters allow jobs to be configured dependent upon the allocated resource. Resource parameters of exclusively allocated resources can be written via the API. This allows resources to be used to store meta data.
Access controlling

Authentication routines for job servers, users and jobs using IDs and passwords are effective methods of controlling access to the system.
Time scheduling

The schedulix Time Scheduling module allows workflows to be automatically run at defined times based on complex time conditions. This usually obviates the need for handwritten calendars, although they can be used whenever required.
Web interface

The schedulix web front end allows standard browsers to be used for modelling, monitoring and operating in intranets and on the internet.
This obviates the need to run client software on the workstations.
API

The full API of the schedulix Scheduling System allows the system to be completely controlled from the command line or from programs (Java, Python, Perl, etc.).
Repository

The schedulix Scheduling System stores all the information about modelled workflows and the runtime data in an RDBMS repository.
All the information in the system can be accessed via the SCI (Standard Catalog Interface) whenever required using SQL.
SSL/TLS

The secure network communication of the schedulix components via SSL/TLS also fulfils more stringent security standards.
Back to the schedulix Homepage

Home »
© independIT Integrative Technologies GmbH
Imprint | Privacy

cnn.com: How Vietnam managed to keep its coronavirus death toll at zero

cnn.com: How Vietnam managed to keep its coronavirus death toll at zero

Live TV
How Vietnam managed to keep its coronavirus death toll at zero
By Nectar Gan, CNN
Updated 3:16 AM EDT, Sat May 30, 2020

(CNN)When the world looked to Asia for successful examples in handling the novel coronavirus outbreak, much attention and plaudits were paid to South Korea, Taiwan and Hong Kong.

But there’s one overlooked success story — Vietnam. The country of 97 million people has not reported a single coronavirus-related death and on Saturday had just 328 confirmed cases, despite its long border with China and the millions of Chinese visitors it receives each year.

This is all the more remarkable considering Vietnam is a low-middle income country with a much less-advanced healthcare system than others in the region. It only has 8 doctors for every 10,000 people, a third of the ratio in South Korea, according to the World Bank.

After a three-week nationwide lockdown, Vietnam lifted social distancing rules in late April. It hasn’t reported any local infections for more than 40 days. Businesses and schools have reopened, and life is gradually returning to normal.

Motorbike riders with face masks are stuck in traffic during the morning peak hour on May 19 in Hanoi.
Motorbike riders with face masks are stuck in traffic during the morning peak hour on May 19 in Hanoi.
To skeptics, Vietnam’s official numbers may seem too good to be true. But Guy Thwaites, an infectious disease doctor who works in one of the main hospitals designated by the Vietnamese government to treat Covid-19 patients, said the numbers matched the reality on the ground.

“I go to the wards every day, I know the cases, I know there has been no death,” said Thwaites, who also heads the Oxford University Clinical Research Unit in Ho Chi Minh City.

“If you had unreported or uncontrolled community transmission, then we’ll be seeing cases in our hospital, people coming in with chest infections perhaps not diagnosed — that has never happened,” he said.

So how has Vietnam seemingly bucked the global trend and largely escaped the scourge of the coronavirus? The answer, according to public health experts, lies in a combination of factors, from the government’s swift, early response to prevent its spread, to rigorous contact-tracing and quarantining and effective public communication.

Acting early
Vietnam started preparing for a coronavirus outbreak weeks before its first case was detected.

At the time, the Chinese authorities and the World Health Organization had both maintained that there was no “clear evidence” for human-to-human transmission. But Vietnam was not taking any chances.

“We were not only waiting for guidelines from WHO. We used the data we gathered from outside and inside (the country to) decide to take action early,” said Pham Quang Thai, deputy head of the Infection Control Department at the National Institute of Hygiene and Epidemiology in Hanoi.

A woman practises social distancing while shopping for groceries from behind a line at a wet market in Hanoi.
A woman practises social distancing while shopping for groceries from behind a line at a wet market in Hanoi.
By early January, temperature screening was already in place for passengers arriving from Wuhan at Hanoi’s international airport. Travelers found with a fever were isolated and closely monitored, the country’s national broadcaster reported at the time.

By mid-January, Deputy Prime Minister Vu Duc Dam was ordering government agencies to take “drastic measures” to prevent the disease from spreading into Vietnam, strengthening medical quarantine at border gates, airports and seaports.

On January 23, Vietnam confirmed its first two coronavirus cases — a Chinese national living in Vietnam and his father, who had traveled from Wuhan to visit his son. The next day, Vietnam’s aviation authorities canceled all flights to and from Wuhan.

As the country celebrated the Lunar New Year holiday, its Prime Minister Nguyen Xuan Phuc declared war on the coronavirus. “Fighting this epidemic is like fighting the enemy,” he said at an urgent Communist Party meeting on January 27. Three days later, he set up a national steering committee on controlling the outbreak — the same day the WHO declared the coronavirus a public health emergency of international concern.

On February 1, Vietnam declared a national epidemic — with just six confirmed cases recorded across the country. All flights between Vietnam and China were halted, followed by the suspension of visas to Chinese citizens the next day.

Over the course of the month, the travel restrictions, arrival quarantines and visa suspensions expanded in scope as the coronavirus spread beyond China to countries like South Korea, Iran and Italy. Vietnam eventually suspended entry to all foreigners in late March.

A Vietnamese People's Army officer stands next to a sign warning about the lockdown on the Son Loi commune in Vinh Phuc province on February 20.
A Vietnamese People’s Army officer stands next to a sign warning about the lockdown on the Son Loi commune in Vinh Phuc province on February 20.
Vietnam was also quick to take proactive lockdown measures. On February 12, it locked down an entire rural community of 10,000 people north of Hanoi for 20 days over seven coronavirus cases — the first large-scale lockdown known outside China. Schools and universities, which had been scheduled to reopen in February after the Lunar New Year holiday, were ordered to remain closed, and only reopened in May.

Thwaites, the infectious disease expert in Ho Chi Minh City, said the speed of Vietnam’s response was the main reason behind its success.

“Their actions in late January and early February were very much in advance of many other countries. And that was enormously helpful … for them to be able to retain control,” he said.

Meticulous contact-tracing
The decisive early actions effectively curbed community transmission and kept Vietnam’s confirmed cases at just 16 by February 13. For three weeks, there were no new infections — until the second wave hit in March, brought by Vietnamese returning from abroad.

Authorities rigorously traced down the contacts of confirmed coronavirus patients and placed them in a mandatory two-week quarantine.

“We have a very strong system: 63 provincial CDCs (centers for disease control), more than 700 district-level CDCs, and more than 11,000 commune health centers. All of them attribute to contact tracing,” said doctor Pham with the National Institute of Hygiene and Epidemiology.

A confirmed coronavirus patient has to give health authorities an exhaustive list of all the people he or she has met in the past 14 days. Announcements are placed in newspapers and aired on television to inform the public of where and when a coronavirus patient has been, calling on people to go to health authorities for testing if they have also been there at the same time, Pham said.

A woman stands in a queue to provide a sample at a makeshift testing centre near the Bach Mai hospital in Hanoi on March 31.
A woman stands in a queue to provide a sample at a makeshift testing centre near the Bach Mai hospital in Hanoi on March 31.
When the Bach Mai hospital in Hanoi, one of the biggest hospitals in Vietnam, became a coronavirus hotspot with dozens of cases in March, authorities imposed a lockdown on the facility and tracked down nearly 100,000 people related to the hospital, including medics, patients, visitors and their close contacts, according to Pham.

“Using contact-tracing, we located almost everyone, and asked them to stay home and self quarantine, (and that) if they have any symptoms, they can visit the health centers for free testing,” he said.

Authorities also tested more than 15,000 people linked to the hospitals, including 1,000 health care workers.

Vietnam’s contact-tracing effort was so meticulous that it goes after not only the direct contacts of an infected person, but also indirect contacts. “That’s one of the unique parts of their response. I don’t think any country has done quarantine to that level,” Thwaites said.

All direct contacts were placed in government quarantine in health centers, hotels or military camps. Some indirect contacts were ordered to self isolate at home, according to a study of Vietnam’s Covid-19 control measures by about 20 public health experts in the country.

A roadside barber donning a face mask gives a haircut to a customer in Hanoi.
A roadside barber donning a face mask gives a haircut to a customer in Hanoi.
As of May 1, about 70,000 people had been quarantined in Vietnam’s government facilities, while about 140,000 had undergone isolation at home or in hotels, the study said.

The study also found that of the country’s first 270 Covid-19 patients, 43 percent were asymptomatic cases — which it said highlighted the value of strict contact-tracing and quarantine. If authorities had not proactively sought out people with infection risks, the virus could have quietly spread in communities days before being detected.

Public communication and propaganda
From the start, the Vietnamese government has communicated clearly with the public about the outbreak.

Dedicated websites, telephone hotlines and phone apps were set up to update the public on the latest situations of the outbreak and medical advisories. The ministry of health also regularly sent out reminders to citizens via SMS messages.

Pham said on a busy day, the national hotlines alone could receive 20,000 calls, not to count the hundreds of provincial and district-level hotlines.

A propaganda poster on preventing the spread of the coronavirus is seen on a wall as a man smokes a cigarette along a street in Hanoi.
A propaganda poster on preventing the spread of the coronavirus is seen on a wall as a man smokes a cigarette along a street in Hanoi.
The country’s massive propaganda apparatus was also mobilized, raising awareness of the outbreak through loudspeakers, street posters, the press and social media. In late February, the health ministry released a catchy music video based on a Vietnamese pop hit to teach people how to properly wash their hands and other hygiene measures during the outbreak. Known as the “hand-washing song,” it immediately went viral, so far attracting more than 48 million views on Youtube.

Thwaites said Vietnam’s rich experience in dealing with infectious disease outbreaks, such as the SARS epidemic from 2002 to 2003 and the following avian influenza, had helped the government and the public to better prepare for the Covid-19 pandemic.

“The population is much more respectful of infectious diseases than many perhaps more affluent countries or countries that don’t see as much infectious disease — Europe, the UK and the US for example,” he said.

“The country understands that these things need to be taken seriously and complies with guidance from the government on how to prevent the infection from spreading.”

View on CNN

© 2020 Cable News Network. Turner Broadcasting System, Inc. All Rights Reserved.

Terms of Use | Privacy Policy | AdChoices

Dr. Ingo Sauer, Applied Econometrics and International Economic Policy

Dr. Ingo Sauer, Applied Econometrics and International Economic Policy

https://www.uni-frankfurt.de/
WirtschaftswissenschaftenFachbereich02

Kontakt
Personensuche

Intranet
Typo3

DE

Applied Econometrics and International Economic Policy

Fachbereich HomeApplied Econometrics and International Economic PolicyKlumpTeamAssistantsDr. Ingo Sauer

Dr. Ingo Sauer
Phone: +49 (69) 798-34781
E-Mail: isauer[at]wiwi.uni-frankfurt[dot]de
Address:

Goethe University Frankfurt
RuW, Postbox 47
Theodor-W.-Adorno-Platz 4
60629 Frankfurt am Main (Germany)
Room: RuW 4.218

Teaching

YouTube Kanal: WISSEN HAT KEINEN EIGENTÜMER

Übung zur Einführung in die Volkswirtschaftslehre, Goethe-Universität Frankfurt (Course Evaluation_1; Course Evaluation_2)

German and European Central Banking – International Summer Univeristy, Frankfurt University of Applied Sciences and Goethe-University (Course Evaluation)

Geld und Währung, DHBW Mannheim

Economics, Finance and Accounting, Graduate School Rhein Neckar (Course Evaluation)

Topical

Nominierter des Fachbereiches Wirtschaftswissenschaften zu 1822-Universitätspreis für exzellente Lehre (07/2019)

WISAG-Preis für die beste sozial- oder geisteswissenschaftliche Dissertation der Goethe-Universität (06/2019)

Publications

Sauer, I. (2015), Ownership Economics: On the Foundation of Interest, Money, Markets, Business Cycles and Economic Development. Edited by Frank Decker. Routledge Frontiers of Political Economy. Routledge, Oxford. Economica, 82: 581-582. doi:10.1111/ecca.12112

Sauer, I. (2012), The Dissolving Asset Backing of the Euro, CESifo Forum 13, Special Issue: The European Balance of Payments Crisis edited by Hans-Werner Sinn, 63-72, online available under: http://www.cesifo-group.de/DocDL/Forum-Sonderheft-Jan-2012.pdf

Sauer, I. (2011), Die sich auflösende Eigentumsbesicherung des Euro, ifo Schnelldienst 64(16), 31. August 2011, 58-68, online available under: http://www.cesifo-group.de/DocDL/SD-16-2011.pdf

Department EI
Home
Akuelles
Team
Prof. Dr. Rainer Klump
Beate Stein (Team Assistant)
Assistants
Dr. Anne Jurkat
Dr. Ingo Sauer
Julian Salg
Lecturers
Student Assistants
Alumni
Teaching
Research
Link

Top-Links

Bibliothek – BRuW
Lernplattform – OLAT
Prüfungsamt
Publikationsdatenbank
SSIX Info Center
Studienberatung
Vorlesungsverzeichnis – LSF

News

Keine Artikel in dieser Ansicht.

Kontakt

Goethe-Universität Frankfurt
Fachbereich Wirtschaftswissenschaften

Besucheradresse:
Campus Westend
Theodor-W.-Adorno-Platz 4
60323 Frankfurt am Main

Postadresse:
60629 Frankfurt am Main

Telefon: +49 (0)69/798-7749

Telefax: +49 (0)69/798-35000

Anfahrt & Lageplan

Besuchen Sie uns auf
Facebook
Instagram
Fachbereich

Daten und Fakten
Dekanat
Anfahrt
Kontakt

Studium

Bachelor
Master
Promotion
Ph.D.-Programme

Forschung

Publikationen
Cluster und Schwerpunkte
Nachwuchsförderung

International

Wirtschaftssprachen
Studieren im Ausland
Internationale Austauschstudierende

Presse & Medien

Imagebroschüre
Newsletter
Rss-Feeds

Akkreditierung

Die Goethe-Universität Frankfurt am Main
Impressum
Datenschutz

© 2004-2020 Goethe-Universität Frankfurt am Main
Top